H5W3
当前位置:H5W3 > 问答 > 正文

WPF MVVMLight:在ViewModel中,开子线程为ObservableCollection集合赋值并且更新UI

我在项目中使用TreeView中通过绑定ItemSource为ObservableCollection集合来显示数据。由于构造ObservableCollection的Nodes花费时间比较长,准备使用在子线程中加载,加载完成后把值赋给Nodes。但是报错【 必须在与DependencyObject相同的Thread上创建DependencySource 】

Model代码:

//树视图数据源
private ObservableCollection<Node> nodes = new ObservableCollection<Node> () ;
public ObservableCollection<Node> Nodes
{
get
{
return nodes;
}
set { nodes = value; RaisePropertyChanged(() => Nodes); }
}

填充Nodes代码(临时创建了nodes_c来保存,完成后统一给Nodes,或者完成一个给一个也行):

 public void FillNode()
{
try
{
nodes_c.Add(integration_.SocialChat(casePath_, Applist_["测试1"], Userlist_));
nodes_c.Add(integration_.SocialChat(casePath_, Applist_["测试2"], Userlist_));
nodes_c.Add(integration_.SocialChat(casePath_, Applist_["测试3"], Userlist_));
}
catch (Exception ex)
{
//log
}
}

调用填充Nodes方法

public CaseViewModel()
{
//这里是用MvvmLight的Messenger触发的Load方法
Messenger.Default.Register<DataHelper>(this, "DB", Load);
}
public async void Load(DataHelper x)
{
await Task.Run(FillNode);
//这里是网上找的方法,但是不起作用。
//效果等于直接写Nodes = new ObservableCollection<Node>(nodes_c);
ThreadPool.QueueUserWorkItem(delegate
{
System.Threading.SynchronizationContext.SetSynchronizationContext(new
System.Windows.Threading.DispatcherSynchronizationContext(System.Windows.Application.Current.Dispatcher));
System.Threading.SynchronizationContext.Current.Post(pl =>
{
//把FillNode里临时的nodes_c 赋值给XAML绑定的Nodes属性
Nodes = new ObservableCollection<Node>(nodes_c);
LogHelper.log_.Warn(Nodes.Count);
}, null);
});
}

回答


Application.Current.Dispatcher.Invoke(action);
代替ThreadPool.QueueUserWorkItem的一堆

这个action就是楼上invoke里面的action

用这个直接就invoke到ui线程执行了

本文地址:H5W3 » WPF MVVMLight:在ViewModel中,开子线程为ObservableCollection集合赋值并且更新UI

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址