gpt4 book ai didi

c# - 当从不同的窗口调用 repository.save 时,mvvm 更新 ListView

转载 作者:太空宇宙 更新时间:2023-11-03 13:22:15 24 4
gpt4 key购买 nike

我有一个 WPF ListView ,其中包含绑定(bind)到 viewmodel.Ingredients(MVVM 模式)的成分

现在,当我在不同窗口(调用 repository.Save())中添加和保存数据库中的成分时,我希望更新此 ListView 。

(viewmodel.Ingredients 调用 repository.findAll())

我看到了 2 种可能的方法:

1) 使用 MVVM:在 Repository.Save() 中引发属性更改事件。但是然后我需要将存储库注册为我 View 中的第二个数据源,或者做其他会导致我的视​​图更新的事情。我该如何实现?

2) 另一种方法是使用 MVC 模式从存储库更新(连同 mmvm)然后 View 模型可以实现 IUpdateIngredients 接口(interface)

public interface IUpdateIngredients
void Update()

然后我的存储库有方法:

public void removeHandler(IUpdateIngredients handler)
public void AddHandler(IUpdateIngredients handler)
public void RaiseUpdateEvent() // call Update() on all the handlers

viewmodel 使用 addHandler 方法注册自己。 repository.Save 方法调用 RaiseUpdateEvent();

这会完成工作,但我真的想摆脱 removehandler 方法。 .NET Framework 是否可以通过事件为我完成删除操作?我想摆脱 removeHander 方法,因为我在许多不同的地方重复使用这个 ListView ,有时在弹出窗口中,我想确保我不会忘记在某处调用 removehandler 方法。

谢谢你帮助我!

最佳答案

我有一个类似的问题,我在进行数据库更新的类中使用了一个调解器,将消息发送到其他 ViewModel 以刷新它们的集合。

由于中介将目标 ViewModel 存储为 WeakReferences ,因此无需删除事件处理程序。这是一个很棒的article带有 Josh Smith 关于中介者模式的示例代码……

我根据自己的需要修改了上面文章中的代码,最重要的是 Mediator 是作为单例实现的,就像这样。

private static readonly Lazy<Mediator> _lazy = new Lazy<Mediator>(() => new Mediator());
public static Mediator Instance { get { return _lazy.Value; } }

现在每个 ViewModel 和 broadcaster 都获得了 Mediator 的实例……

public Mediator Mediator
{
get { return Mediator.Instance; }
}

更新数据库的类将消息发送给需要刷新的ViewModel。

Mediator.NotifyColleagues(MediatorMessages.DBUpdated);

ViewModel 在构造函数中注册消息,然后更新集合。

Mediator.Register(MediatorMessages.DBUpdated, new Action(RefreshCollection));

关于c# - 当从不同的窗口调用 repository.save 时,mvvm 更新 ListView ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23738753/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com