我使用后台线程获取WPF窗口的数据,代码如下[使用4.0框架和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()方法中,我为ObservableCollection的groups包含了NotifyCollectionChangedAction.Reset,但这并没有起到帮助作用。更奇怪的是,我只调用了一次列表上的NotifyCollectionChangedAction.Reset,但它却执行了三次,而该列表有十个项目?!
我可以通过编写以下内容来解决此问题:
DataContext = await Task.Factory.StartNew(() => serviceagent.GetGroups(instances));
但这是更新DataContext和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);
}
}
{ instances.Groups = new ViewModelCollection<Group>(webcall); RaiseCollectionChanged(); }
。 - Gerard