要麼我沒有看到解決方案,要麼發現使用MVVM時存在一個缺陷。使用Master-Detail場景的MVVM陷阱
我有這個樣本主詳細:
class Customer
{
int CustomerID {get;set}
string Name {get;set}
ObservableCollection<Order> Orders {get;set}
}
class Order
{
int OrderID {get;set}
int Quantity {get;set}
double Discount {get;set}
}
讓我們假設在我CustomerOrdersViewModel我的ObservableCollection客戶通過... =綁定到視圖「{結合客戶}」,當顧客從改變用戶的相關訂單通過ItemsSource =「{Binding SelectedItem.Orders,ElementName = comboboxCustomer}」顯示在DataGrid中。
這是可能的MVVM:
我可以通過簡單地增加一個新的客戶(爲簡單起見)調用Customers.Add(new Customer(){...});
。
添加後,我這樣做:this.RaisePropertyChanged("Customers");
。這將更新視圖並立即在Customer-Combobox中顯示客戶。
現在來MVVM的不可能的部分。
我可以SelectedCustomer.Orders.Add(New Order(){...});
添加一個新的訂單,但我不能現在訂單養CollectionChanged/PropertyChanged事件像之前與客戶因爲訂單地產不是通過公共的訪問必將查看。
即使我會暴露訂單綁定屬性到視圖,視圖本身關心的主從切換不是在ViewModel ...
問題
怎麼可能使主 - 細節列表中的添加/刪除對象的詳細工作,並立即更新視圖?
我檢查了你的代碼,必須說它太複雜了。 WPF很好。 MVVM在WinForms中使事情變得過於複雜。如果你問我,MVVM就不可能使用實體框架。嘗試使用MVVM進行Eager加載,然後您知道我的意思。 每個LOB都有大量的主細節。現在我知道爲什麼每個MVVM樣本都有一個愚蠢而純粹的顯示所有客戶列表演示... 如果您知道另一個MVVM Master-Detail示例,我將不勝感激鏈接:) 對於那些對此事有興趣的人: http://www.codeproject.com/KB/WPF/WpfNhibernateToolkit.aspx – msfanboy 2010-02-27 20:38:04
MVVM與View和ViewModel之間的關係處理很多,但關於VM的關係模型完全默默地猜測爲什麼?您從DAL獲取數據並閱讀3 ObservableCollection中的相關客戶,訂單,產品?這是一個很大的努力,創造一種entityViewModel上下文......似乎太多的開發者使用VS2010 wpf RAD設計工具來實現真正的LOB應用程序需要更多... –
msfanboy
2010-02-27 20:50:14
啊 - 但我不同意這裏。是的,代碼很複雜,但它是完全可重用的。使用它只是將一個行爲拖到你的主列表上,並且它「正常工作」。 – 2010-02-27 20:56:03