2011-08-16 25 views
1

アップデート2C#/ WPFデータバインディングとbackgroundworkers

いくつかのものがたくさん明確になったので、私は、全体の質問を書き換えましたが、問題は今、私は別のスレッドでDependencyPropertiesのリストを作成したことのようですDependencyPropertiesが使用される場所:(。

私はXAMLバインディングはArgumentException

を引き起こす BackgroundWorker上のいくつかの作業を行うときよりも

はDependencyObjectのと同じスレッド上でDependencySourceを作成する必要があります。私はいくつかのint型、リストのと辞書が含まれているINotifyPropertyChangedを実装する単純なクラスを持っている

私は次のセットアップを持っています。 Calculatorに私は複数のバインディングを持っているUserControlXAMLファイルで

BackgroundWorker worker = new BackgroundWorker(); 
worker.DoWork += delegate(object o, DoWorkEventArgs args) 
{ 
    lock (Calculator) 
    {  
     Calculator.Calculate(); 
    } 
}; 
worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted); 
worker.RunWorkerAsync(); 

:それは多くの時間を取ることができますので、私は、Calculate方法を実行するためにBackgroundWorkerを使うUserControl

public class Calculator : INotifyPropertyChanged 
{ 
    //Note that InstanceGroup is a dependency object 
    private List<InstanceGroup> instanceGroups = new List<InstanceGroup>(); 
    public List<InstanceGroup> InstanceGroups 
    { 
     get { return instanceGroups; } 
     set { instanceGroups = value; } 
    } 

    // snip // 

    public void Calculate() 
    { 
     InstanceGroups = MyNewFilledInstanceGroup; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("instanceGroups")); 
      } 
    } 
} 

{Binding Path=Calculator.InstanceGroups, Path=userControlName}のような。私はあなたが使用する必要があることを確信していないです

答えて

2

は(私はそのようなプログレスバーか何かを表示することができますので、全体的な目標は、別のスレッドで計算方法ですべての作業を行うことができるようにすることです)このObservableコレクションのDP。 ViewModelに保存するのがベストです。

ObservableCollectionsは、スレッドセーフではありません、あなたは、コレクションを更新するために、ディスパッチャを使用する必要があります。

Googleのディスパッチャを使用するのObservableCollectionへの拡張といくつかの記事がありました。

This link might help

+0

Hev Anvarbek、ObservableCollectionをObservableCollectionに通常のList <>で置き換えましたが、問題は解決しません。 –

0

どれDependencyObjectは、あなたがそのオブジェクトの正しいスレッドに作業をプッシュすることができますDispatcherプロパティが含まれています。

あなたは正しいスレッド上でコードを実行するためにDispatcher.InvokeまたはDispatcher.BeginInvokeを使用することができます。

0

完全を期すために、私はWPFの第一人者Dean Chalkの2つのソリューションを言及したい:

  1. スレッドセーフな観察可能なコレクションを作成します。それはちょうど動作する古い学校のソリューションです。ソースコードを入手するには、short article in his blogをご確認ください。これは先にこのスレッドでanvarbek raupovによって言及されました。同様の解決策はSasha Barber's blogです。
  2. Reactive Extensionsライブラリを使用してください。例については、this articleを参照してください。 1つのタスクでは少し大きめですが、同時に便利なツールが多数用意されています。
関連する問題