wpf notsupportedexception

时间:2012-04-06 12:47:16

标签: c# wpf dispatcher

我有一个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");
        }
    }

在我看来,客户必须使用组合框。

在另一个视图模型中,我在另一个线程上引发CustomerSavedMessage 当我尝试在上面的Register的处理程序委托中处理消息时 抛出notsupportedexception,并显示以下消息:

   {"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)?

1 个答案:

答案 0 :(得分:2)

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

例如:

Messenger.Default.Register<CustomerSavedMessage>(this, message =>
{
     Application.Current.Dispatcher.Invoke(
         new Action(() => Customers.Add(message.UpdatedCustomer))); 
});