2010-09-28 106 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