MVVMでのタスクを並列化からどうのObservableCollection <>結果を処理するには?
-
26-09-2019 - |
質問
私は別のタスクでデータを収集していると私はデータにしたいObservableCollection<>
を使用してGUIコンポーネントに結果をバインドします。だから私のコードは次のようになります:
private ObservableCollection<MyItem> _items;
public ObservableCollection<MyItem> Items
{
get { return _items; }
set
{
if (_items.Equals(value))
{
return;
}
_items = value;
RaisePropertyChanged("Items");
}
}
private void LoadData()
{
Task task = Task.Factory.StartNew(() =>
{
ObservableCollection<MyItem> itms = _htmlParser.FetchData(...);
Dispatcher.CurrentDispatcher.Invoke((Action)delegate
{
Items = itms;
});
});
}
データは、いくつかのHTTPリクエストを行うコンポーネントから取得されます。私は取得していますエラーは次のとおりです。
Must create DependencySource on same Thread as the DependencyObject.
私はMVVMライトツールキットフレームワークを使用しています。私はまた、メッセージとして結果を送信しようとしたが、それは同じエラーメッセージで終わりました。任意のアイデアやポインタ?
編集:ここで問題があります:
public class MyItem
{
public string Id { get; set; }
public string Name { get; set; }
public BitmapImage Image { get; set; } // <--- A big No No because it inherits from the DependencyObject
public Uri Uri { get; set; }
}
IはBitmapImage
データ型にbyte[]
を変更します。
解決
あなたが取得している例外は、(「のDependencyObjectと同じスレッド上でDependencySourceを作成する必要があります」)はその何かのバックグラウンドスレッド上で作成し、UIスレッド上で使用されていることを示します。 UIによって作成され、使用のためにコレクションに格納されている任意のUIコントロールがありますか?
私はのObservableCollection自体はバックグラウンドスレッドで作成されていることがわかり、私はそれが問題だとは思わない - 残念ながら私はそのコードと確認するために、オフィスにいないよ。
。他のヒント
あなたがいないことを確認これについてDispatcher.CurrentDispatcher
にApplication.Current.Dispatcher
を交換しようとすることができますが、