1

我有一个 mvvm 应用程序,

在视图模型中:

    public CommandViewModel()         
    {
        Messenger.Default.Register<CustomerSavedMessage>(this, message =>
        {
            Customers.Add(message.UpdatedCustomer);
        });
    } 

    private ObservableCollection<Customer> _customers;
    public ObservableCollection<Customer> Customers 
    {
        get { return _customers; }
        set
        {
            _customers = value;
            OnPropertyChanged("Customers");
        }
    }

在我看来,客户被绑定到一个组合框。

在不同的视图模型中,当我尝试处理 Register 的处理程序委托中的消息时,我在不同的线程上引发了 CustomerSavedMessage,上面抛出了一个不支持的异常,并带有以下消息:

   {"This type of CollectionView does not support changes to its SourceCollection from a thread different from the Dispatcher thread."}

我显然需要使用 Dispatcher 对象进行跨线程操作,但我无法从 viewmodel 弄清楚这是如何完成的。

我还认为框架会知道如何处理过度绑定之间的交叉线程..

如何在 Dispatcher 线程上执行 Customers.Add(message.UpdatedCustomer) ?

4

1 回答 1

2

您可以在 ViewModel 构造函数 ( )中使用Application.Current.Dispatcher获取应用程序的主线程或捕获调度程序。DispatcherDispatcher.CurrentDispatcher

例如:

Messenger.Default.Register<CustomerSavedMessage>(this, message =>
{
     Application.Current.Dispatcher.Invoke(
         new Action(() => Customers.Add(message.UpdatedCustomer))); 
});
于 2012-04-06T12:56:21.357 回答