2017-03-09 64 views
0

我構建了一個複雜的UI應用程序,其中一個窗口包含一個Canvas控件,該控件繪製了一個有向無環圖(DAG)的節點。因爲那個窗口相當複雜(並且因爲我對WPF一無所知),所以我認爲我會使用CustomControl(而不是用戶控件,因爲我認爲用戶控件是用來將事物分組在一起的)。我正在嘗試構建的應用程序應該遵循MVVM。MVVM中的自定義控件

現在我創建GraphControl作爲Selector控件的子類。

問題1:那個類是ViewModel嗎?我不明白GraphControl類在盛大的MVVM故事中的角色。

問題2:當我把它添加到我的主要應用程序,我必須做一些事情,如:

<GraphControl DataContext="{Binding RelativeSource={RelativeSource Self}}" ... 

看起來對我來說,我真的不明白這些東西是如何工作的。

幫助?

編輯:顯然那個人和我有同樣的問題(https://mutelight.org/datacontext-in-a-custom-control)。在文章中給出的解決方案是這樣:

<GraphControl><Grid DataContext="{Binding RelativeSource={RelativeSource Self}}" ... 

這聽起來就像hackish的我雖然...

+0

恐怕這個問題太寬泛了,不適合。爲這樣一個相當複雜的場景提供解決方案,同時回答者也應該解釋MVVM的基礎知識,我想太多了。您應該從理解MVVM背後的原理和理念開始,通過創建像hello-world一樣的應用程序,將文本框綁定到viewmodel屬性並瞭解它。由於MVVM嚴重依賴於框架提供的機制,因此我認爲完全不瞭解您無法完全理解或監督的內容。 –

+0

但是爲了給你提供一個提示,你提供的有關'DataContext'的例子是不正確的。 'DataContext'實際上不是您想要用於某個特定目的的項目(如檢索節點),而是您指定的控件的根目錄。因此,如果您的VM包含深層嵌套的對象,那麼您可以指定它,並且嵌入到其中的任何控件都將解析與其相關的綁定。 –

+0

所以你需要寫這樣的東西: '' 其中'Nodes'是包裝此控件的綁定上下文內的屬性。 –

回答

2

問題1:是類視圖模型?我不明白GraphControl類在大型MVVM故事中的作用。

編號GraphControl只是屬於該視圖的另一個控件。內置控件的示例包括TextBox,ButtonListBox等幾種。您的GraphControl只是另一種類型的控制。

視圖模型是控件綁定的內容。有關MVVM設計模式的基本介紹和每個組件的角色,請參閱MSDN:https://msdn.microsoft.com/en-us/library/hh848246.aspx

問題2:當我把它添加到我的主要應用程序,我必須做一些事情,如:

您可以設置的控制這樣或那樣的DataContext。最常見的方法是父窗口的DataContext設置爲視圖模型的實例,例如:

public MainWindow() 
{ 
    InitializeComponent(); 
    DataContext = new ViewModel(); 
} 

子元素繼承了元素樹其父元素的DataContext除非DataContext屬性是明確設置爲別的。

這意味着您的控件將繼承其父面板的DataContext,該面板依次繼承其父元素的DataContext,依此類推。

下將控制自身,這意味着你可以綁定到GraphControl類的任何屬性,而無需指定明確的源DataContext

<GraphControl DataContext="{Binding RelativeSource={RelativeSource Self}}" ...> 

無論你想這樣做,取決於您的要求。

+0

「是否要這樣做取決於您的要求。」要求通常不包括「打破數據綁定如何工作」。這是一種可怕的做法,你應該感到羞恥,因爲它暗示它在任何可以接受的地方。羞愧!無論如何,這是一個自定義控件,所以很有可能他會使用控件模板,這意味着他可以使用TemplateBindings綁定到控件的屬性。 – Will

+0

你真的說這對於將DataContext屬性綁定到元素本身是一種「恥辱」 – mm8

+1

@將以這種方式濫用數據上下文通常是一個壞主意,除非你有非常迫切的需求,但沒有任何東西被破壞,只是被濫用,並且作爲OP說他想要自己的相對來源而不是mm8,那麼你的批評就是針對錯誤的目標 – MikeT

1

回答你的問題,最好的方法是解釋MVVM

的M是數據模型,這種控制訪問數據,即鏈接到Web服務,數據庫,文件等

的V是視圖,其控制如何從用戶收集數據並向用戶顯示數據

VM是2之間的接口,它從模型中收集需要顯示給用戶的數據並處理來自用戶的輸入用戶在將數據保存到模型之前對數據進行驗證和執行業務檢查

所以要回答你的第一個問題控制是他們收集視圖元素和顯示數據給用戶,如果他們做其他事情,那麼你已經打破MVVM

回答你的第二個問題,如果你已經正確地構建您的控制您添加它的方式與添加其他控件(如ListView或Button)的方式相同,如何將數據導入控件取決於您如何構建它,如果這意味着您將它設計爲綁定在datacontext上,那麼這就是您如果不是,則綁定到您在控件代碼文件中設置的正確的依賴項屬性。

+0

是的,我終於明白了。我不需要另一個CustomControls,ItemsControl對我需要做的事情來說很好。 –

+0

模板的力量可能會有點棘手讓你的頭來回當你從一個winforms envionment – MikeT