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

Customers は私のビューのコンボボックスにバインドされています。

別のビューモデルで、Register のハンドラー デリゲートでメッセージを処理しようとすると、次のメッセージで notsupportedexception がスローされると、別のスレッドで 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 に答える