我有一个可观察的集合作为视图模型中的属性公开。可观察集合加载了来自数据访问层(linq2sql)的对象。
当通过另一个视图模型将新项目添加到数据库时,更新可观察集合的最佳方法是什么?我应该使用对数据库的查询重新填充可观察集合,还是直接将新对象插入集合中?
此外,我仍在努力研究如何让一个视图模型与另一个模型进行通信,但我只使用mvvm 3天。
答案 0 :(得分:3)
您可以使用全新的类来管理从一个类到另一个类的通知。对于是否加载所有实体或仅添加新添加的实体的问题,它实际上取决于每次加载的可能实体的数量。如果它们很少,您可以每次重新加载它们,否则只需将新添加的对象添加到集合中。
示例:
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);
}
}
答案 1 :(得分:2)
每当模型对象保存到数据库中时,都会向视图模型发送消息,包括已保存的模型对象。这可以使用Messenger helper class in MVVM Light Toolkit
来实现答案 2 :(得分:1)
至于第二部分(如何教视图模型相互交谈)我更喜欢将视图模型保持为尽可能分离。因此,Event Aggregation或某种Message Broker似乎是自然的选择。
问题的第一部分有点棘手,我不知道答案是否正确。如果Observable集合包含数千个项目,我会尝试选择一种不涉及完全重建的方法。否则,请尝试最简单,最简单的解决方案。
答案 3 :(得分:0)
我使用我创建的库,它们有效地允许一个DataContext将更改保存回父DataContext,并让父DataContext通知其子节点它刚收到更改。
有了这个功能,我为我的整个应用程序创建了一个主DataContext,然后对于任何带有Ok和Cancel按钮的模态窗口或暂时需要他们自己的“现实视图”的UI的其他部分,我创建了子DataContexts。当子DataContext写回父级时,这会导致绑定到父级中的对象的所有控件都更新,并且父级将更改广播到所有子级,以便它们也可以更新(如果它们处于快照模式,则不会更新)。 / p>
此解决方案需要一段时间才能编码,但效果很好。我也使用完全相同的机制将更改发送到由其他客户端共享的服务器上的父DataContext,因此每个人都拥有最新的数据并为我提供了很好的缓存性能。我甚至用它来与我的后端数据存储进行通信。