MVVM中的大型模型集合

3
在实现WPF中的第一个MVVM应用程序时,我一直在思考将Model集合包装在相关的ViewModel集合中以在View中使用的利弊。
在我们的系统中,我们可能会有几个潜在的大型集合,例如订单中的订单行和可以选择订单行的库存项目。目前,在数据访问层中从SQL中查找这些内容,然后循环遍历SqlDataReaders以创建Model对象集合。
然后,在创建ViewModel对象集合时循环遍历Model对象集合似乎是不必要的开销。当存在大量Model对象集合时,直接在View上公开这些对象是否更好呢?
感谢您的帮助,马克。
编辑 在阅读这个主题时,我找到了今年7月的MSDN文章(由Josh Smith审查),它给出了MVVM的相当平衡的观点,在“集合”部分中说道:

集合的另一个问题是确定是否需要在ViewModel实例中包装集合中的每个模型实例。对于较小的集合,ViewModel可以公开一个新的可观察集合,并将底层模型集合中的所有内容复制到ViewModel可观察集合中,同时将集合中的每个模型项目包装在相应的ViewModel实例中。ViewModel可能需要侦听集合更改事件,以将用户更改传输回底层模型。

但是,对于将以某种形式的虚拟化面板公开的非常大的集合,最简单和最实用的方法就是直接公开模型对象。

非常感谢到目前为止的评论,尝试限制传递到ViewModel中的数据量或使用分页或其他适当的控件肯定会减少问题,但我想知道是否仍然有情况下最好只是将绑定到ViewModel内的Model对象集合?请注意保留HTML标记。

Ted是我的昵称,代表着我的真名模型Mark!(这个评论是ViewModel?!) - Ted
1个回答

0

我猜这取决于您如何显示数据。毕竟,ViewModel 主要用于处理 View 需要的数据。

假设您的数据层只提供数据集合,您始终可以根据实际要查看的元素限制 ViewModel 中元素的创建。

例如,您可能有一个 Datagrid 用于显示给定订单的订单项。

因此,您可以在 ViewModel 属性 AllOrderItems 上绑定 datagrid,而其 getter 如下所示:

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

这里的DataAccessLayer是一个类,它保存缓存数据库数据并与数据库进行接口交互。如果将其保持为单例,则其中的数据重复将会减少。

您可以根据需要调整ViewModel以对来自DataAccessLayer的数据进行多少或多少过滤。如果需要,集合可以是Observable,DataAccessLayer可以生成事件供VM响应,以处理添加、删除、保存到数据库的新数据情况。


抱歉完成这个查询有点慢!我们现在已经完成了这个项目,并且认为我应该整理一下事情。我们最终确实包装了模型对象,并且在数据网格中显示大量行(50k +)时确实存在速度问题,但正如Chris和之前的回答者所指出的那样,这并不是一个合理的期望,需要对数据网格进行分页处理。我们设置了过滤器以防止用户经常返回这么多行,或者至少警告他们在删除某些过滤器时可能会出现减速。感谢您的意见! - Ted

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接