2011-01-29 72 views
0

讓我們假設我急切地加載一些商務的與NHibernate,EF或任何你想要的ORM工具...WPF/MVVM =>域集結成集ObservableCollections

現在我有一個IList,其中每個客戶有很多訂單和每個訂單都有很多產品。

您的CustomerRepository中有一個GetAllCustomer()方法。

,你在哪裏,你如何集中所有的數據到

類型的三個ObservableCollections

客戶,訂單和產品,因爲我需要添加/刪除通知的事件!?

你真的做這樣的事情在BillingViewModel在您執行customerRepo.GetAllCustomer():

BillingViewModel.cs 


private ObservableCollection<Customer> _customersOC = new ObservableCollection<Customer>(); 

public BillingViewModel() 
{ 

var customers = customerRepo.GetAllCustomer(); 
ConvertDomainToUICollections(customers); 

} 


private ConvertDomainToUICollections(IList<Customer> customers) 
{ 

    foreach(Customer c in customers) 
    { 
     _customersOC.Add(c); 
     foreach(Order o in c.Orders) 
     { 

      // Here I do not know how to proceed and put each in another OC<Order> etc... 
     } 

    } 
} 

回答

0

就個人而言,我嘗試這樣的綜合數據只有在需要時,在「最低水平「可能。

例如,在BillingViewModel中,我會爲客戶做這樣的聚合。但是,我不會在這裏執行訂單 - 而是在CustomerViewModel內處理此操作,因爲我會嘗試設置它以便我編輯特定客戶的訂單。

如果您需要在非常高的水平上做到這一點,您將有效地重寫您的整個模型。這可以完成,但它確實會降低數據的實用性和可維護性,因爲您有效地將該模型的兩個完整版本維持在非常高的水平。

這就是說,許多ORM爲您處理這個更好。例如,Lightspeed(我最喜歡的一個)只是讓它們的集合自動從ORM直接實現INotifyCollectionChanged。這使得不需要轉換爲ObservableCollection<T> - 您可以使用從ORM返回的數據。

+0

是的,我瞭解該工具及其功能。似乎是一個偉大的產品,如果提供。 – msfanboy 2011-01-29 21:49:06

+0

很好,我現在再次檢查他們的主頁,他們在免費版中做了改動。以前,它只限於8張桌子。現在它僅限於用粗體字書寫的8個模型。之前我沒有選擇LS的原因是我有很多N:M的桌子超過了前8桌的規則,但是現在一切都完全符合8款車型,感謝里德在這裏間接回答你解決了我的問題:P – msfanboy 2011-01-29 22:08:46

0

一種選擇是創建表示域模型中所有三種類的類(基本上是視圖模型)。因此,您將創建一個customerVM類,並且它將具有一個成員可觀察的orderVM集合,並且orderVM將擁有一個成員可觀察的productVM集合。然後,將域模型映射到viewModels,這是數據的UI表示形式。

有些人覺得爲域和視圖模型分開分類並且必須在它們之間來回映射是很痛苦的。不過,我認爲這僅僅是使用數據綁定和MVVM的實際情況。一種選擇可能是爲您的域對象生成代理或包裝器,另一種可能是在域對象本身上具有通知接口。

鏈接到一個相關的問題: WPF/MVVM: Delegating a domain Model collection to a ViewModel

編輯:我只是意識到鏈接的問題是你的問題也是如此。 :)

0

您可能會感興趣的WPF Application Framework (WAF)BookLibrary示例應用程序。這是一個使用實體框架的WPF MVVM應用程序。它通過引入一個EntityObservableCollection來解決你的問題。