首页 文章

MVVM中的大型模型集合

提问于
浏览
2

在WPF中实现我的第一个MVVM应用程序时,我一直想知道在相关的ViewModel集合中包装Model集合以在View中使用的优缺点 .

在我们的系统中,我们可能会有几个可能很大的集合,例如订单中的订单行和可以为订单行选择的库存项目 . 目前,这些是从数据访问层中的SQL查找的,然后循环使用SqlDataReaders来创建模型对象的集合 .

然后,在创建ViewModel对象集合时循环遍历Model对象集合似乎是一种不必要的开销 . 当有大量的Model对象时,最好直接在View上公开它们吗?

马克,先谢谢你的帮助


Edit 在阅读这个主题的同时,我发现从今年7月开始this MSDN article(由Josh Smith评论不少),这给出了一个非常 balancer 的MVVM视图,并在'Collections'部分说:

集合的另一个问题是确定何时或是否在ViewModel实例中将每个Model实例包装在集合中 . 对于较小的集合,ViewModel可以公开新的可观察集合,并将底层Model集合中的所有内容复制到ViewModel可观察集合中,将集合中的每个Model项目包装在相应的ViewModel实例中 . ViewModel可能需要侦听集合更改事件以将用户更改传输回基础模型 . 但是,对于将以某种形式的虚拟化面板公开的非常大的集合,最简单和最实用的方法就是直接公开Model对象 .

非常感谢到目前为止的评论,试图限制传递到ViewModel的数据量,或者使用分页或其他合适的控件可以减少我确定的问题,但我想知道是否还会出现这样的情况更好地简单地绑定到ViewModel中的一组Model对象?

1 回答

  • 0

    我想这真的取决于你想要如何显示数据 . 毕竟,ViewModel主要用于处理View所需的数据 .

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

    例如,您可能有一个Datagrid来显示给定订单的订单商品 .

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

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

    这里DataAccessLayer是一个保存缓存数据库数据和数据库接口的类 . 如果保持为单身,那么其中的数据重复将会减少 .

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

相关问题