我有一个可观察的集合作为视图模型中的属性公开。可观察集合加载了来自数据访问层 (linq2sql) 的对象。
当通过另一个视图模型将新项目添加到数据库时,更新可观察集合的最佳方法是什么?我应该使用对数据库的查询来重新填充可观察集合还是直接将新对象插入到集合中?
此外,我仍在尝试研究如何让一个视图模型与另一个视图模型进行通信,但我只使用 mvvm 3 天。
我有一个可观察的集合作为视图模型中的属性公开。可观察集合加载了来自数据访问层 (linq2sql) 的对象。
当通过另一个视图模型将新项目添加到数据库时,更新可观察集合的最佳方法是什么?我应该使用对数据库的查询来重新填充可观察集合还是直接将新对象插入到集合中?
此外,我仍在尝试研究如何让一个视图模型与另一个视图模型进行通信,但我只使用 mvvm 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);
}
}
每当模型对象被保存到数据库中时,向视图模型发送一条消息,包括保存的模型对象。这可以使用MVVM Light Toolkit 中的 Messenger 助手类来实现
我使用我创建的库,这些库有效地允许一个 DataContext 将更改保存回父 DataContext,并让父 DataContext 通知其子级它刚刚收到更改。
使用此功能,我为整个应用程序创建一个主 DataContext,然后为任何带有“确定”和“取消”按钮的模式窗口或 UI 的其他部分暂时需要自己的“现实视图”,我创建子 DataContexts。当子 DataContext 写回父级时,这会导致绑定到父级中的对象的所有控件更新,并且父级将更改广播给所有子级,以便它们也可以更新(或者不更新,如果它们处于快照模式)。
这个解决方案需要一段时间来编码,但效果很好。我还使用完全相同的机制将更改发送到服务器上由其他客户端共享的父 DataContext,因此每个人都有最新的数据并为我提供出色的缓存性能。我什至用它来与我的后端数据存储进行通信。