【问题标题】:Update observable collection by requerying or adding to collection?通过重新查询或添加到集合来更新可观察集合?
【发布时间】:2010-06-17 08:04:39
【问题描述】:

我有一个可观察的集合作为视图模型中的属性公开。可观察集合加载了来自数据访问层 (linq2sql) 的对象。

当通过另一个视图模型将新项目添加到数据库时,更新可观察集合的最佳方法是什么?我应该使用对数据库的查询来重新填充可观察集合还是直接将新对象插入到集合中?

此外,我还在尝试如何让一个视图模型与另一个视图模型通信,但我只使用 mvvm 3 天。

【问题讨论】:

    标签: wpf linq-to-sql mvvm mvvm-light


    【解决方案1】:

    您可以使用全新的班级来管理从一个班级到另一个班级的通知。对于是否加载所有实体或仅添加新添加的实体的问题,它实际上取决于每次可能加载的实体数量。如果它们很少,您可以每次重新加载它们,否则只需将新添加的对象添加到集合中即可。

    例子:

    class ViewModel1
    {
        ObservableCollection<Object> entities;
    
        public ViewModel1()
        {
            EventsManager.ObjectAddedEvent += new EventHandler<ObjectAddedEventArgs>(EventsManager_ObjectAddedEvent);
            entities = new ObservableCollection<Object>();
        }
    
        void EventsManager_ObjectAddedEvent(object sender, ObjectAddedEventArgs e)
        {
            entities.Add(e.ObjectAdded);
        }
    }
    
    class EventsManager
    {
        public static event EventHandler<ObjectAddedEventArgs> ObjectAddedEvent;
    
        public static void RaiseObjectAddedEvent(Object objectAdded)
        {
            EventHandler<ObjectAddedEventArgs> temp = ObjectAddedEvent;
            if (temp != null)
            {
                temp(null, new ObjectAddedEventArgs(objectAdded));
            }
        }
    }
    
    class ObjectAddedEventArgs : EventArgs
    {
        public Object ObjectAdded { get; protected set; }
    
        public ObjectAddedEventArgs(Object objectAdded)
        {
            ObjectAdded = objectAdded;
        }
    }
    
    class ViewModel2
    {
        public void AddObject(Object o)
        {
            EventsManager.RaiseObjectAddedEvent(o);
        }
    }
    

    【讨论】:

      【解决方案2】:

      每当模型对象被保存到数据库中时,向视图模型发送一条消息,包括保存的模型对象。这可以使用Messenger helper class in MVVM Light Toolkit

      来实现

      【讨论】:

        【解决方案3】:

        至于第二部分(如何教视图模型相互交谈),我更喜欢让视图模型尽可能地解耦。因此Event Aggregation 或某种Message Broker 似乎是很自然的选择。

        问题的第一部分有点棘手,我不知道正确答案。如果 Observable 集合包含数千个项目,我会尝试选择一种不涉及完全重建的方法。否则,请尝试您能想到的最简单、最简单的解决方案。

        【讨论】:

          【解决方案4】:

          我使用我创建的库,这些库有效地允许一个 DataContext 将更改保存回父 DataContext,并让父 DataContext 通知其子级它刚刚收到更改。

          使用此功能,我为整个应用程序创建一个主 DataContext,然后为任何带有“确定”和“取消”按钮的模式窗口或 UI 的其他部分暂时需要自己的“现实视图”,我创建子 DataContexts。当子 DataContext 写回父级时,这会导致绑定到父级中的对象的所有控件更新,并且父级将更改广播给所有子级,以便它们也可以更新(或者不更新,如果它们处于快照模式)。

          这个解决方案需要一段时间来编写代码,但效果很好。我还使用完全相同的机制将更改发送到服务器上由其他客户端共享的父 DataContext,因此每个人都有最新的数据并为我提供出色的缓存性能。我什至用它来与我的后端数据存储进行通信。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-05-27
            • 1970-01-01
            • 1970-01-01
            • 2020-08-14
            • 2012-10-20
            • 1970-01-01
            • 1970-01-01
            • 2016-04-29
            相关资源
            最近更新 更多