我在这样的背景线程中为 wpf 窗口获取数据 [framework 4.0 with async/await]:
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
of 组所包含的方法中,这无济于事。
更奇怪的是,我NotifyCollectionChangedAction.Reset
只在列表中调用了一次,却被执行了三次,而列表中有十项?!
我可以通过写来解决这个问题:
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);
}
}