【发布时间】:2011-01-25 13:11:39
【问题描述】:
我一定是搜索迟缓,因为这是另一个我无法解决的看似常见的问题。
这是我的问题——我正在使用 WPF 和 MVVM,并且我有一个在模型中执行的状态机。如果发生错误,我需要将信息传递给 ViewModel 以显示错误。这部分似乎工作正常。当用户单击所需的行为时,模型中的代码会继续执行,并查看用户与之交互的对象以确定下一步要做什么。
问题在于模型需要重新加载一个文件,该文件会使用该文件的内容更新 GUI。因为模型是在一个线程中执行的,你可以想象我接下来要问的问题——你到底是如何与 GUI 正确同步的?在 MFC 中,我会使用 SendMessage 或 PostMessage 来完成 GUI 更新。
我有 read articles for WinForms 建议在必要时使用 InvokeRequired 自动调用 BeginInvoke。我实际上不知道 BeginInvoke 会完成我想要的,所以我被鼓励去学习这个。
我实际上如何从我的模型中调用 BeginInvoke?这个方法甚至适用于 WPF 吗?我继续实现了一个委托,然后调用了 Invoke,但我得到了同样的错误,告诉我不能从这个线程修改集合。我也尝试过 BeginInvoke,但我认为这也行不通,因为它无论如何都会从不同的线程启动。
困惑。如果我错过了在互联网上发布的非常明显的内容,请继续对我进行口头抨击,我可能应得的。
编辑 - 我可能还应该补充一点,我正在寻找除计时器或基于 BackgroundWorker 的解决方案之外的其他东西,除非这是在 WPF 中解决此问题的唯一方法/MVVM。另外,我想知道是否有任何 MVVM 工具包已经具备此类功能......
【问题讨论】:
-
澄清一下:我假设您只是直接在委托上调用 Invoke() 而不是 Dispatcher.Invoke()?第一个将简单地在同一个线程上执行委托,第二个将编组对 Dispatcher 线程的调用(根据使用 ViewModel 的应用程序类型,可能存在也可能不存在)。
-
韦恩,你是对的。我只是粗略地关注这篇文章,我想知道它是针对 WinForms 的事实是否就是他们的示例有效的原因?无论如何,我认为 Franci 是对的,我需要以任何必要的方式传递 Dispatcher。 :) 谢谢你的时间。希望我能尽快解决这个问题。
-
您可以利用 MVVMLights Messenger 类向 GUI 发送消息而无需通过事件。如果背后的代码触及任何实际 UI,您仍然必须通过 Dispatcher。我有点困惑,因为数据绑定已经通过调度程序,为什么这是一个问题。如果您的 Thread 更新了 View 上的绑定属性,它应该会自动编组到 UI 中而不会出现问题。
标签: c# wpf user-interface mvvm synchronization