2014-10-02 24 views
2

我用MVVM模式創建了UserControl,其中UserControl的「智能」位於其viewModel中。使用該控件時MVVM UserControl和綁定

我想在不同的視圖(xaml)中使用UserControl,因此該視圖的開發人員不必介意它是如何完成的。

我在我的UserControl中添加了一些dependencyProperties,所以最終程序員可以給控件一些上下文信息。

但我有一些綁定問題。

在client.xaml:

<Grid> 
<MyUserControl MyDependencyProperty0={Binding ClientViewModelProperty0}/> 
</Grid> 

和myusercontrol.xaml

<Grid> 
<TextBlock Text={Binding TextToDisplay}/> 
</Grid> 

其中TextToDisplay是MyUserControlViewModel的性質。 我只需要ClientViewModelProperty0設置一次,我不需要clientViewModel被設置爲的MyUserControl的DataContext的,因爲它有自己的DataContext(視圖模型)

我認爲解決方案將是一個不同的結合表達式語法(相對來源?自我?)但我看不到哪一個...

+2

是不是又是時候讓我複製我的「爲用戶控件創建視圖模型是代碼味道」的答案?你有這個問題的原因是因爲這個。想一想:TextBox控件是否具有TextBoxViewModel,或者它是否具有視圖模型綁定的屬性和事件?那麼爲什麼你的UserControl行爲不一樣? [我的一個「不這樣做!」答案(http://stackoverflow.com/questions/25795871/wpf-databinding-with-mvvm-and-user-controls/25796096#25796096) – Will 2014-10-02 14:54:20

回答

1

可重複使用的控件傾向於遵循與完整的應用程序視圖不同的設計。具體來說,他們並沒有以完全相同的方式遵循MVVM。

請記住,在WPF中,控件是「無形的」:它們的視覺外觀由模板控制。底層類控件的「模型」。像@威爾在他的評論中提到的,TextBox沒有TextBoxViewModel; 「視圖模型」TextBox實例。 「視圖」是應用的模板。雖然UserControl是模板化控件有點不同(其內容是自包含的,所以它的有效「查看」和「視圖模型」),相同的基本規則:

當您創建您自己的可重用控件,將您的屬性和行爲置於控件類本身中。這樣,當您將其插入視圖時,您可以設置參數,只要您喜歡,例如將它們與父視圖模型綁定即可。一個可重用的控件不應該依賴一些外部/環境視圖模型。