【发布时间】:2013-11-23 01:47:48
【问题描述】:
我在这样的后台线程中为 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 组中,但这没有帮助。
更奇怪的是,我在列表中只调用了一次NotifyCollectionChangedAction.Reset,却被执行了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);
}
}
【问题讨论】:
-
如果 XAML 文件中的绑定正确完成,我认为问题出在 GetGroups 方法中。你能告诉我们这个方法吗?
-
基本上代码就是
{ instances.Groups = new ViewModelCollection<Group>(webcall); RaiseCollectionChanged(); } -
请在问题中输入代码,而不是 cmets。还要添加任何缺少的相关代码。你在哪里调用重置,它与问题的其余部分有什么关系?
标签: wpf async-await ui-thread