在单独的线程WPF上更新两个单独的UI

时间:2011-11-04 00:56:49

标签: wpf multithreading mvvm

我有一个窗口(Windows窗体),除了其他控件之外,我有两个WPF用户控件。

一个用户控件具有项目列表(名称),旁边有可用的复选框。 其他人有项目的描述(一些图片和其他细节)。

两个用户控件都有自己的视图模型

用户可以在第一个用户控件中选择和取消选中复选框。根据他的选择,项目详细信息将被添加/删除到第二个用户控件。

我们从数据库中获取所有数据。因此,最初填充我们从数据库中检索数据。我们还将用户的选择/取消选择存储回数据库。第二个用户控件还需要刷新数据库中的数据。我们不会在记忆中存储任何东西。

需要发生的是,当用户在第一个usercontrol中选择/取消选择时,它应该被添加到第二个用户控件中。 因此操作是:将选择保存或删除到数据库中 - >向第二个用户控件发送请求以刷新其从数据库中读取数据的集合。

我正在使用第一个usercontrol的Dispatcher对象(从第一个用户控件视图模型中的eventhandler调用)并在Parent Form(Windows容器窗体)上调用方法。然后,此父窗体将调用刷新第二个用户控件的第二个用户控件视图模型。

问题是第一个用户控件的UI冻结,直到整个过程完成。我想要的是第一个用户的UI控制不冻结。原因是第一控制的UI不需要等待第二用户控件中的操作被更新。第二个视图刷新可以排队。

基本上我想要的是当用户选择/取消选中复选框时只发送通知(用于刷新第二个用户控件)并继续我的用户控制而不是等待。

我尝试了背景工作者,但似乎没有任何效果。

感谢任何帮助。

  • 吉里贾

1 个答案:

答案 0 :(得分:1)

如果您能够创建两个视图使用的ViewModel实例,则可以避免执行任何通知编码。

如果你需要保持VM的独立性,那么如果你的代码中有某种事件机制就行了。 例如,如果您使用Unity,可以使用EventAggregator进行通知,这将绕过父表单,您的第二个视图模型应该能够刷新自己,而不必在GUI线程上。

快速,但不太可能尝试的事情是(我说不太可能,因为我没有能够从中获得任何性能优势)

using (Dispatcher.CurrentDispatcher.DisableProcessing())
{
//notification code here
}

当然,如果你的第二个viewModel从某个地方抓取数据,请确保它是异步的。