2011-11-03 11 views
5

私は、テキストボックスにバインドするプロパティでINotifyPropertyChangedを使用しているwpfプロジェクトを持っています。タスク(TaskParallelLibrary)を使用して別のスレッドでこの値を更新しています。これは正しく更新され、例外はスローされません。 UIスレッドではなくバックグラウンドスレッドで実行されているため、例外がスローされると思っていました。もちろん、私はUI要素を直接使用すると例外がスローされます。したがって、INotifyPropertyChangedバインドメカニズムはUIスレッドへのディスパッチを自動的に処理しますか?タスク並列ライブラリINotifyPropertyChanged例外をスローしませんか?

ここに私のコードがあります。

private string _textProperty = ""; 
    public string TextProperty 
    { 
     get 
     { 
      return _textProperty; 
     } 
     set 
     { 
      if (_textProperty != value) 
      { 
       _textProperty = value; 
       NotifyPropertyChanged("TextProperty"); 
      } 
     } 
    } 

と私のタスクの作成は

var task = new Task(() => 
     { 
      TextProperty = "ABCD"; // Works. 
      // txtBox.Text = "ABCD"; // Throws an exception. 
     }); 
     task.Start(); 

で、XAMLでのテキストボックスには、アフィンスレッドされていない単一のプロパティにバインド<TextBox Name="txtBox" Text="{Binding TextProperty}"/>

答えて

6

UIスレッドではなくバックグラウンドスレッドで実行されているため、例外がスローされると考えていました。

WPFでは、バックグラウンドスレッドにバインドされた値を設定できます。 UIスレッドへのマーシャリングを処理します。

ただし、これはではありません。はコレクションの要素に対して機能します。バインドされているObservableCollection<T>に追加する場合は、たとえば、UIスレッドにマーシャリングする必要があります。ただし、必要に応じてこれを緩和できるvarious workaroundsがあります。 this behavior changes in WPF 4.5は、将来のWPFでのマルチスレッド開発を簡素化することに注意してください。

+1

+1。 WPF 4.5への興味深いリンク。彼らは私がWPFについて嫌いなことをいくつか整理したようです。 – RichardOD

+0

@Reed wpfがアップデートをどのように管理しているかを参考にしてください。 –

1

です。あなたは問題なくこれを行うことができます、バインディングはあなたのために必要な作業を行います。
ただし、これは単一のプロパティーバインディングにのみ適用されます。たとえばObservableCollectionがある場合、コレクションがバインディングによってバインドされていても、別のスレッドからアイテムを追加または削除することはできません。

関連する問題