2

ItemsSource が ObservableCollection であるツリー ビューがあります。バックグラウンドワーカーを使用し、子ノードに対応する基礎となるObservableCollectionを変更することにより、ユーザーがサブツリーを展開するたびに子コンテンツを動的にロードしています。ただし、そのスレッド内でこの ObservableCollection を変更しようとすると、ツリーが既に展開されている場合にのみ失敗します (つまり、子の数が少ない場合は正しく設定されます)。

私が達成したいと思っていることは、ツリーを展開すると、子が処理されるときに動的に入力されることを確認できることです。ObservableCollection を使用してその動作を実現するにはどうすればよいですか?

4

1 に答える 1

6

ObservableCollection を使用してその動作を実現するにはどうすればよいですか?

問題は、WPF のバックグラウンド スレッドでコレクションを更新できないことです。バインディング システムは、ほとんどの単純なバインディングを UI スレッドに自動的にマーシャリングしますが、コレクションにはマーシャリングしません。2 つのオプションがあります。

  • Dispatcher.Invokeまたはを使用して呼び出しをマーシャリングし、データを UI スレッドに戻すことができますDispatcher.BeginInvoke。これにより、データを追加できますが、WPF がバインドを更新するときにクロス スレッド例外は発生しません。

  • (.NET 4.5 を使用している場合) バインディングで新しいEnableCollectionSynchronizationを使用して、コレクションへのクロススレッド アクセスを許可できます。

于 2012-08-21T00:50:04.407 に答える