實際上,如果您的模型已經實現INotifyPropertyChanged和/或IError信息,您可能希望將其綁定到模型屬性。但是,如果你想做特殊驗證和其他模型一無所知的東西,請在視圖模型中添加屬性包裝器。
本文給出了一種混合的一個很好的例子:很正常http://msdn.microsoft.com/en-us/magazine/dd419663.aspx
通常我的MV屬性看起來像這樣和多數民衆:
public string Symbol
{
get { return Model.Symbol; }
set { Model.Symbol = value; this.NotifyOfPropertyChange(() => this.Symbol); }
}
我常常不執行INotifyPropertyChanged模型,因此經常我必須寫封裝。
編輯:回覆您的其他信息:保持同步收藏和列表可能有點棘手。在你的情況下,我會做的是爲每個模型類創建一個視圖模型,但不包裝所有的屬性只是像這樣訪問它們:{Bindng Customer.Name}。但是,當然你必須爲包含視圖模型的集合創建一個包裝器。 Prism文檔正如他們自己所說的那樣,只是指導,如果您的場景需要不同的方法,那麼這很好。
看看這段代碼。我只包裝我將通過模型訪問的集合和屬性。這給你兩全其美。如果你需要一個不屬於你的模型的特殊屬性,你可以將它添加到視圖模型中(請參閱CustomerViewModel),或者如果你需要特定的屬性通知。
class CompanyViewModel{
public CopanyViewModel(Company c){
foreach(var customer in c.Customers)
Customers.Add(new CustomerViewModel(customer);
}
public Company Company {get;set;}
public ObservableCollection<CustomerViewModel> Customers {get;set;}
}
class CustomerViewModel{
public CustomerViewModel(Customer c){
Customer = c;
}
public Customer Customer {get;set;}
public Brush CustomerBackground{
get{
if(Customer.Active)
return Brush.Greeen;
else
return Brush.Red;
}
}
}
(此代碼可能無法正常工作,我只是鍵入它在這裏。)現在
,如果你需要更改的通知適用於所有型號,你必須在你的模型要麼實現它所有的屬性或包裝視圖模型中的所有屬性。
我編輯了我的問題,添加了關於我手頭項目的更多信息,以及爲什麼我提出了這個問題。 – 2011-04-27 23:32:33
嘿,我研究了一些,我想我最終達成了我的要求。我將在我的模型中使用IDataErrorInfo,INotifyPropertyChanged和ObservableCollection。他們不是WPF特有的,他們將解決幾乎所有的問題。 – 2011-04-29 11:31:58
是的,它們位於System.ComponentModel命名空間中,它應該用於創建域模型(這就是爲什麼Collection是例如沒有List ,因爲你的模型應該公開Collection而不是列表等)。無論如何,你會發現很多有趣的事情。有時你不能將INorifyChanged添加到你的模型中,原因很多,但在你的情況下,這可能是有道理的。另外請確保你使用類似這樣的改變通知:http://csharperimage.jeremylikness.com/2010/06/tips-and-tricks-for-inotifypropertychan.html。使重構更容易。 –
lukebuehler
2011-04-29 14:56:10