【问题标题】:Large Model Collections in MVVMMVVM 中的大型模型集合
【发布时间】:2011-04-18 08:14:42
【问题描述】:

在 WPF 中实现我的第一个 MVVM 应用程序时,我一直想知道将模型集合包装在相关的 ViewModel 集合中以在视图中使用的优缺点。

在我们的系统中,我们可能有几个潜在的大型集合,例如订单中的订单行,以及可以为订单行选择的库存项目。目前这些都是在Data Access层从SQL中查找,然后循环SqlDataReader来创建Model Objects的集合。

然后在创建 ViewModel 对象集合时围绕 Model 对象集合循环似乎是不必要的开销。当有大量 Model 对象集合时,直接在 View 上公开这些对象会更好吗?

提前感谢您的帮助,马克


编辑 在阅读这个主题时,我发现 this MSDN article 从今年 7 月开始(由 Josh Smith 评论过),它给出了一个非常平衡的 MVVM 视图,并且在“集合”部分中这样说:

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

但是,对于非常大的集合 会以某种形式暴露 虚拟化面板,最简单 最务实的做法就是 直接公开模型对象。

非常感谢到目前为止的 cmets,尝试限制传递到 ViewModel 的数据量,或者使用分页或其他合适的控件会减少问题,我敢肯定,但我想知道是否还会出现以下情况最好简单地绑定到 ViewModel 中的模型对象集合?

【问题讨论】:

  • Ted 是我的昵称 查看我的真名模特 Mark! (而这条评论就是 ViewModel?!)

标签: wpf mvvm


【解决方案1】:

我想这实际上取决于您希望如何显示数据。毕竟 ViewModel 主要用于处理 View 所需的数据。

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

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

因此,您可以将 ViewModel 属性 AllOrderItems 绑定到数据网格,但它的 getter 如下:

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

这里的 DataAccessLayer 是一个保存缓存数据库数据和数据库接口的类。如果保持为单例,则其中的数据重复将减少。

您可以调整 ViewModel 以根据需要对来自 DataAccessLayer 的数据进行尽可能多的过滤。如果需要,这些集合可以是可观察的,并且 DataAccessLayer 可以为 VM 生成事件,以便在添加、删除、保存到数据库中的新数据的情况下做出反应。

【讨论】:

  • 很抱歉在完成此查询时有点慢!我们现在已经完成了这个项目,并认为我应该整理一下。我们确实最终包装了模型对象,并且在数据网格中显示大量行(50k +)时确实存在速度问题,但正如 Chris 和之前的回答者所指出的那样,这并不是一个真正合理的期望无需分页即可处理的数据网格。我们设置了过滤器以防止用户经常返回这么多行,或者至少警告他们在删除某些过滤器时可能会降低速度。感谢您的意见!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-18
  • 2018-10-25
相关资源
最近更新 更多