2012-03-31 59 views
0

更新一个TreeView的ItemsSource我有这样的功能:每个用户执行某些操作时在另一个线程

public void UpdateList() 
{ 
BindList = Model.GetList(); 
TreeView1.ItemsSource = BindList; 
} 

UpdateList()需要被调用(因此树视图列表重新加载)。它目前工作,它只是非常缓慢,所以我想在另一个线程中执行它。

我对WPF相当陌生...在WinForms程序中,我用于制作委托并检查InvokeRequired等。但是我发现这在WPF中不起作用。

所以,如果我想调用UpdateList(),以便它在另一个线程中运行,并且ItemsSource从另一个线程更新,那么我应该如何执行?

感谢

+0

[MSDN(HTTP: //msdn.microsoft.com/en-us/library/ms741870.aspx) – 2012-03-31 14:39:10

+0

不应该这样的事实,即ItemsSource已经绑定(BindList)到TreeView,并且线程函数正在更新BindList,这意味着UI应该自动反映这一点? – theqs1000 2012-03-31 14:53:00

+0

在这个函数中,你正在访问一个UI元素,它不能在后台线程上完成,你可以改变这个集合本身,但它需要实现INotifyCollectionChanged。 – 2012-03-31 14:55:38

回答

1
  1. 变化Model.GetList()功能财产ObservableCollection<>类型例如:

    public ObservableCollection<DataItem> List { get; set; }

  2. 呼叫TreeView1.ItemsSource = Model.List只有一次。它为您提供了WPF绑定的优点。

  3. 创建一个BackgroundWorker以加载处理程序中的数据DoWork。将数据加载到临时收集并将该收集复制到Model.ListRunWorkerCompleted处理程序。
    如果你想更新你的树,而数据加载,你可以看看这个方法:WPF update binding in a background thread

  4. 阅读和学习MVVM pattern了解WPF的主要思想发展