この [フレームワーク 4.0 with async/await] のように、バックグラウンド スレッドで wpf ウィンドウのデータをフェッチします。
async void refresh()
{
// returns object of type Instances
DataContext = await Task.Factory.StartNew(() => serviceagent.GetInstances());
var instances = DataContext as Instances;
await Task.Factory.StartNew(() => serviceagent.GetGroups(instances));
// * problem here * instances.Groups is filled but UI not updated
}
GetInstances に GetGroups のアクションを含めると、UI にグループが表示されます。
別のアクションで更新すると、DataContext には正しいグループが含まれますが、UI には表示されません。
私がグループに含めたGetGroups()
方法NotifyCollectionChangedAction.Reset
ではObservableCollection
、これは役に立ちません。
さらに奇妙なのはNotifyCollectionChangedAction.Reset
、リストに 10 個のアイテムがあるのに、リストを 1 回だけ呼び出すのに 3 回実行されるということです!
次のように書くことで問題を解決できます。
DataContext = await Task.Factory.StartNew(() => serviceagent.GetGroups(instances));
しかし、これはバックグラウンド プロセスを介して DataContxt と UI を更新する通常の方法ですか?
実際には、既存の DataContext を再度設定せずに更新したいだけですか?
編集:serviceagent.GetGroups(instances)
より詳細に:
public void GetGroups(Instances instances)
{
// web call
instances.Admin = service.GetAdmin();
// set groups for binding in UI
instances.Groups = new ViewModelCollection<Groep>(instances.Admin.Groups);
// this code has no effect
instances.Groups.RaiseCollectionChanged();
}
ここViewModelCollection<T>
から継承しObservableCollection<T>
、メソッドを追加しました:
public void RaiseCollectionChanged()
{
var handler = CollectionChanged;
if (handler != null)
{
Trace.WriteLine("collection changed");
var e = new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset);
handler(this, e);
}
}