2012-04-06 3 views
1

iv'e a une application MVVM,WPF NotSupportedException

dans un viewmodel:

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"); 
     } 
    } 

clients est lié à un combobox à mon avis.

dans un autre viewmodel je lève un CustomerSavedMessage sur un thread différent lorsque je tente de gérer le message dans le délégué du gestionnaire de registre ci-dessus NotSupportedException est jeté avec le message suivant:

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

i évidemment besoin pour utiliser l'objet Dispatcher pour l'opération de thread croisé, mais je ne peux pas comprendre comment cela est fait à partir du viewmodel.

aussi je pensais que le cadre sache comment gérer le filetage entre sur la liaison ..

comment puis-je exécuter le Customers.Add (message.UpdatedCustomer) sur le fil Dispatcher?

Répondre

2

Vous pouvez utiliser Application.Current.Dispatcher pour obtenir Dispatcher pour le thread principal ou le répartiteur de capture de l'application dans votre constructeur ViewModel (Dispatcher.CurrentDispatcher).

Par exemple:

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