2012-07-19 58 views
0

請幫我簡單的用戶控件和MVVM模式:如何使用?

public partial class OrderControl : UserControl 
{ 
    private OrderHeader orderHeader; 
    public Customer selectedCustomer { get; set; } 
    private Customer[] allCustomers; 
    public User selectedManager { get; set; } 
    private User[] allManagers; 


    public OrderControl() 
    { 
     InitializeComponent(); 
     DataContext = this; 
    } 
... 
} 

我需要一種方式結合來源:

<ComboBox Name="CustomerComboBox" SelectedItem="{Binding selectedCustomer}"/> 

是保持selectedCustomer屬性,OrderControl.xaml.cs或我這個最好的方法需要使用..,selectedCustomer創建一些OrderViewModel類...屬性並在OrderControl.xaml.cs中保留一個OrderViewModel的實例?

感謝

回答

0

最好是創建一個視圖模型類,請將您的屬性,那類讓它成爲你UserControlDataContext

此外,您selectedCustomer財產只是一個普通的.NET特性,它需要支持INotifyPropertyChanged接口,以方便裝訂和變更通知...通常一個基地ViewModel類,所有的其他ViewModel類繼承會實現這個接口...

+0

該屬性不能是一個DependencyProperty,如果他把它放入一個ViewModel中,就可以將它綁定到他的ComboBox上。他需要實現的是INotifyPropertyChanged來提供通知。 – Mark 2012-07-19 18:08:57

+0

@Mark,你是對的,它不需要是DP ...通常ViewModel基類實現INotifyPropertyChanged ... – 2012-07-19 18:29:20

+0

但是,如果您將UsersControl的視圖模型分配給它自己的DataContext,則會中斷在構成UserControl的父控件中所做的綁定。在擁有的父控件中進行的特定綁定將解析爲UserControl自己的視圖模型,而不是父視圖模型,這是意想不到的,需要混亂的解決方法。 – Neutrino 2013-01-10 11:01:17

0

這將工作,如果你實現INotifyPropertyChanged。現在,當屬性設置時,組合框無法獲取更新。請參閱http://msdn.microsoft.com/en-us/library/ms229614.aspx

但是,如果您希望遵循MVVM,那麼您將需要創建視圖模型對象。

+0

爲什麼OP需要實現INotifyPropertyChanged,因爲所有OP都需要單向綁定到源。我同意,如果OP想要OneWay或TwoWay綁定,INotifyPropertyChanged將不得不實施,但在這種情況下不會。 – Thelonias 2012-07-19 18:54:07

0

,如果你想創建真正的用戶控件你不應該:

DataContext = this; 

這裏從H.B.報價

這是不好的做法,設置的DataContext就像是看不見 「從外面」和不切實際的,因爲在DataContext 的繼承通常是你想要什麼,並期望

here被類似的問題,回答。

但是如果你想先用viewmodel做MVVM。雷切爾

報價:

記住,與MVVM你的ViewModels是你 應用。該視圖只是一個漂亮的界面,允許用戶與您的ViewModel進行交互 。

這意味着你應該創建適當的視圖模型與你需要的所有屬性和命令。從你的usercontrol中刪除所有代碼,因爲它現在只是一個視圖。視圖模型首先通過數據模型連接視圖模型和視圖。

+0

謝謝blindmeis – artos 2012-07-28 12:28:42