XAML UI线程中的WPF更新observableCollection

hmmo2u0o  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(230)

我有WinForms与WPF用户控制。

public partial class DynamicMediator : Form
{
        public DynamicMediator()
        {
            InitializeComponent();
            lmDynamicMediator = new LMDynamicMediator.MediatorMainWindow();            
            this.elementHost1.Child = this.lmDynamicMediator;
        }
        public MainWindowViewModel GetEditFormViewModel()
        {
            return lmDynamicMediator.Resources["ViewModel"] as MainWindowViewModel;
        }
}

我在ViewModel中启动了一个新进程,之后我需要更新我使用的ViewModel中的observableCollection

Dispatcher.CurrentDispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => HasListMessages.Add(item)));

但我有个例外
此类型的CollectionView不支持从Dispatcher线程以外的线程对其SourceCollection进行更改
如果我使用这样代码

Application.Current.Dispatcher.BeginInvoke(DispatcherPriority.Normal, new Action(() => HasListMessages.Add(item)));

我有这样的例外
系统.窗口.应用程序.当前.get返回空值
我做错了什么?
如何在我的ViwModel中获取系统.窗口.应用程序.当前

h7wcgrx3

h7wcgrx31#

在尚未与Dispatcher关联的线程中调用Dispatcher.CurrentDispatcher将创建一个新的Dispatcher,该Dispatcher不是UI线程的Dispatcher。
使用创建视图模型示例的线程的Dispatcher,将其保存在视图模型类的字段中

public class MainWindowViewModel
{
    private readonly Dispatcher dispatcher;

    public MainWindowViewModel()
    {
        dispatcher = Dispatcher.CurrentDispatcher;
    }

    ...
}

然后使用该字段:

dispatcher.BeginInvoke(() => HasListMessages.Add(item));

相关问题