2010-09-28 105 views
2

雖然在WPF中實現我的第一個MVVM應用程序,但我一直想知道在View中使用的相關ViewModel集合中包裝Model集合的優缺點。MVVM中的大型模型集合

在我們的系統中,我們可能有幾個潛在的大集合,例如訂單中的訂單行以及可爲訂單行選擇的庫存項目。目前,這些都是從數據訪問層的SQL中查找的,然後SqlDataReaders環繞創建一個模型對象集合。

然後,在創建ViewModel對象集合時循環收集Model對象看起來像是不必要的開銷。當Model對象的集合較大時,最好是直接在View上公開這些對象?

預先感謝您的幫助,馬克


編輯 雖然在這個問題上我發現今年this MSDN article從七月讀了這給出了一個非常平衡的觀點(由約什 - 史密斯沒少綜述) MVVM的,並在「類別」部分對此表示:

與集合的另一個問題是 確定何時或是否包裹每個 模型我在ViewModel實例中收集 的實例。對於 小集合,視圖模型可以 展露新觀察到的收集和 底層 模式集合中的所有內容複製到視圖模型 觀察集合,包裹每 示範項目集合在一個 對應的視圖模型的實例,因爲它 去。 ViewModel可能需要 監聽收集更改事件 以將用戶更改傳回 底層模型。

然而,對於非常大的集合 會以某種形式 虛擬化面板,最簡單,最 務實的態度來暴露只是爲了 公開模型直接對象。

非常感謝您的意見,到目前爲止,試圖限制傳遞到視圖模型的數據量,或使用分頁或其他適當的管制措施,將減少問題,我敢肯定,但我不知道是否會有仍存在是否只需將ViewModel中的Model對象集合綁定就可以了?

+1

是標記還是特德? – 2010-09-28 14:46:12

+0

泰德是我的暱稱查看我的真名模型的馬克! (這個評論是ViewModel?!) – Ted 2010-09-28 14:53:26

回答

0

我想這實際上取決於你想如何去顯示數據。畢竟,ViewModel主要用於處理View需要的數據。

假設您的數據圖層只提供數據集合,您可以始終根據實際需要查看的元素限制ViewModel中元素的創建。

例如,您可能有一個Datagrid來顯示給定訂單的訂單項目。

因此你可以有一個ViewModel屬性AllOrderItems綁定到DataGrid,但其吸氣劑如下:

public List<OrderItems> AllOrderItems 
{ 
get{return this.DataAccessLayer.GetOrderItems().Where(x=>x.OrderNumber==this.OrderNumber).toList(); 
} 

這裏DataAccessLayer是保存緩存數據庫中的數據和接口到數據庫中的類。如果保存爲單身人士,則其內的數據重複將會減少。

您可以調整您的ViewModel以根據需要對DataAccessLayer中的數據進行儘可能多或少量的過濾。如果需要,集合可以是可觀察的,並且DataAccessLayer可以爲虛擬機生成事件以響應添加,刪除和保存到數據庫的新數據。

+0

對不起,在完成這個查詢的時候有點慢!我們現在已經完成了這個項目,並認爲我應該把事情整理一下。我們確實最終包裝了模型對象,而且在數據網格中顯示大量行(50k +)時的確遇到了速度問題,但是作爲Chris和前面的答覆者指出,這並不是真正合理的預期datagrid處理沒有分頁。我們設置了過濾器來防止用戶定期返回這麼多行,或者至少警告他們在某些過濾器被刪除時可能會發生減速。感謝您的輸入! – Ted 2011-01-05 15:30:10