2011-11-03 66 views
2

我創建自定義控件,因爲我需要在樣式/模板內部進行大量的綁定,所以使用MVVM完全有意義。我在哪裏聲明依賴屬性呢?自定義控件,查看模型和依賴屬性

他們留在控制課上嗎?我如何將它們鏈接到VM?

回答

4

my answer to your other question約自定義控件和視圖模型。這裏的簡短版本:

  1. 自定義控件不應該有視圖模型。
  2. 請勿設置您自己的控件的數據上下文。這是爲消費者保留的。
  3. 所有的依賴項屬性應該在MyCustomControl.cs文件中聲明。
  4. 在你的genric.xaml中使用TemplateBinding,因爲Binding更有效率。

換句話說,邊界或按鈕的視圖模型是什麼?答:他們沒有一個,因爲他們只是控件。 UserControls擁有視圖模型,但控件只是呈現並與您給它們的數據交互(在UserControl中)。對於經驗豐富的MVVM開發人員來說,自定義控件開發可能是最困難的事情:您的反應是製作視圖模型,但這種反射不幸是錯誤的。我知道是因爲我自己犯了這個錯誤。

+0

加1,這應該是正確的答案 –

1

依賴屬性可能會在它們所屬的控件中被拖動。

當在WPF/Silverlight中跟隨MVVM時,常用的方法是將ViewModel設置爲相應View的DataContext。因此,您可以使用XAML中的綁定將自定義的依賴屬性鏈接到ViewModel屬性。

讓我們假設你已經設置ViewMosel到視圖的DataContext:

var view = new UserView 
       { 
       DataContext = new UserViewModel { Name = "Custom Name" } 
       }; 

public class UserViewModel 
{ 
    string Name { get; set; } 
} 

UserView.xaml:

<TextBlock Text="{Binding Name}" /> 
+0

這是你如何使用usercontrol,而不是自定義控件 –

+1

@Xin:我忽略了一個自定義控制點 – sll

+0

@Xin:實際上據我所知,我已經使用自定義控件而沒有模板綁定方法,但直接在View.Xaml中指定綁定,例如''所以這應該不是問題 – sll

0

創建自定義控件時,控件本身是視圖模型。在其上聲明依賴性屬性以公開自定義控件的用戶可以利用的綁定。例如,如果您有時間軸控件,則可能會將控件上的StartDate和EndDate等屬性顯示爲依賴項屬性。您的控件默認模板將使模板綁定到依賴項屬性。然後,您的控件的使用者可能會擁有一個項目時間線視圖模型,以便將其綁定到控件上的屬性。

自定義控件的主要目的是提供易於覆蓋的行爲和默認外觀(通過提供新模板)。希望這可以幫助。

相關問題