相当于C#中的PostMessage与主线程与MVVM同步?

Dav*_*ave 7 c# wpf user-interface synchronization mvvm

我必须坚持不懈地寻找,因为这是我无法解决的另一个看似常见的问题.

这是我的问题 - 我正在使用WPF和MVVM,并且我有一个在模型中执行的状态机.如果发生错误,我需要将信息传递给ViewModel以显示错误.这部分似乎工作正常.当用户单击所需行为时,模型中的代码将继续,并查看用户与之交互的对象以确定下一步操作.

问题是模型需要重新加载文件,该文件用所述文件的内容更新GUI.因为模型在一个线程中执行,你可以想象我接下来要问的问题 - 你到底该如何正确地与GUI同步?在MFC中,我会使用SendMessage或PostMessage来完成GUI更新.

读过WinForms的文章,建议使用InvokeRequired在必要时自动调用BeginInvoke.我实际上不知道BeginInvoke会完成我想要的东西,所以我被鼓励学习这个.

我如何从我的模型中实际调用BeginInvoke?这种方法甚至适用于WPF吗? 我继续并实现了一个委托,然后调用了Invoke,但我得到了同样的错误,告诉我无法从该线程修改集合.我也尝试过BeginInvoke,但是我认为它也行不通,因为它无论如何都会从另一个线程启动.

困惑.如果我错过了一些关于互联网的非常明显的内容,请继续给我一个口头抨击,我可能应得的.

编辑 - 我应该补充一点,我正在寻找除定时器或基于BackgroundWorker的解决方案以外的东西,除非这是在WPF/MVVM中解决这个问题的唯一方法.另外,我想知道是否有任何MVVM工具包已经有了这类工具的设施......

Fra*_*nov 8

如果要将后台线程中的某些工作安排到WPF中的UI线程,请使用DispatcherObject.这是一篇关于如何使用Dispatcher构建更多响应式应用程序的好文章.

更新:请注意,如果您使用事件将模型中的通知发送到ViewModel,您仍需要切换到某处的UI线程.该开关应该在Model还是ViewModel中是一个很好的设计讨论,但它与您的问题是正交的.

该事件将在相应的Dispatcher线程上引发.由于您需要访问UI线程,因此需要使用在UI线程上创建的Dispatcher.获得一个的最简单方法是DispatcherObject.Dispatcher在其中一个UI元素上使用该属性.另一种方法是在Model或ViewModel中创建一个.如果您是设计纯粹主义者,我建议您在模型中创建Dispatcher,并在引发ViewModel正在侦听的事件之前将调用分派回UI线程.这样,所有线程切换和管理都包含在模型中,而ViewModel仅作为UI线程上的单线程工作.