TreeViewItem不能在BackgroundWorker中更新
本文关键字:更新 BackgroundWorker 不能 TreeViewItem | 更新日期: 2023-09-27 18:12:39
我有这个方法来更新我的TreeView
。如果我不使用BackgroundWorker
,一切都很好。但如果这样做,那么我的TreeViewItem
不更新,但它的DataContex的变化。这也很好:item.IsEnabled = false;
private void twSports_Expanded(object sender, RoutedEventArgs e)
{
TreeViewItem item = e.OriginalSource as TreeViewItem;
TreeLeaf leaf = item.DataContext as TreeLeaf; var bgWorker = new BackgroundWorkerOnGrid(gridPartitions);
bgWorker.DoWork += delegate(object s, DoWorkEventArgs args)
{
if (leaf.Item != null)
{
if (leaf.Item.GetType() == typeof(SportType))
{
SportType sport = leaf.Item as SportType;
args.Result = LoadSportPartitions(sport);
}
if (leaf.Item.GetType() == typeof(SportPartition))
{
SportPartition partition = leaf.Item as SportPartition;
args.Result = LoadSportPartitions(partition);
}
}
};
bgWorker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
List<SportPartition> partitions = args.Result as List<SportPartition>;
if (partitions != null)
{
leaf.LoadChilds(partitions.ToArray()); //it doesn't work
item.IsEnabled = false; //it works
}
(s as BackgroundWorkerOnGrid).Dispose();
};
bgWorker.RunWorkerAsync(leaf.Item);}
任何想法?
使用Invoke方法http://msdn.microsoft.com/en-us/library/zyzhdc6b.aspx(如何从c#中的另一个线程更新GUI ?),这里有一个例子如何http://www.codeproject.com/KB/tree/ThreadingTreeView.aspx.
我不确定问题是否更WPF具体;如果是这样,我的建议是:
如果你已经使用了数据绑定,这可能是一个DataContext解决问题,你的DataContext被一些其他值覆盖/替换。关于DataContext如何工作,请参考以下两个链接:
http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.datacontext.aspx http://msdn.microsoft.com/en-us/library/ms752347.aspx http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.datacontextchanged.aspx