Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在单独的线程WPF上更新两个单独的UI_Wpf_Multithreading_Mvvm - Fatal编程技术网

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

在单独的线程WPF上更新两个单独的UI,wpf,multithreading,mvvm,Wpf,Multithreading,Mvvm,我有一个窗口(Windows窗体),其中除了其他控件外,还有两个WPF用户控件 一个用户控件旁边有一个带有可用复选框的项目(名称)列表。 另一个有项目的描述(一些图片和其他细节) 两个用户控件都有其视图模型 用户可以选择和取消选择第一个用户控件中的复选框。根据他的选择,项目详细信息将添加/删除到第二个用户控件 我们正在从数据库中获取所有数据。因此,我们首先从数据库中检索数据以进行填充。我们还将用户的选择/取消选择存储回数据库。第二个用户控件还需要刷新数据库中的数据。我们不在内存中存储任何东西 需

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

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

两个用户控件都有其视图模型

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

我们正在从数据库中获取所有数据。因此,我们首先从数据库中检索数据以进行填充。我们还将用户的选择/取消选择存储回数据库。第二个用户控件还需要刷新数据库中的数据。我们不在内存中存储任何东西

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

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

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

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

我试过背景工作者,但似乎什么都不起作用

感谢您的帮助

  • 吉里贾

如果您能够创建两个视图都使用的ViewModel实例,那么您可能不必执行任何通知编码

如果您需要保持VM的独立性,那么如果您的代码中有某种类型的事件机制,就可以做到这一点。 例如,如果您使用的是Unity,则可以使用EventAggregator来执行通知,这将绕过父窗体,并且您的第二个viewmodel应该能够刷新自身,而不必在GUI线程上

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

当然,如果您的第二个viewModel从某处获取数据,请确保它是异步的

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