在我的 Silverlight 应用程序背后的代码中,我需要重新填充 TreeView,然后选择特定的 TreeViewItem。
代码本身很简单,就在这里(我将对其进行修剪和伪代码化以使其尽可能短)
private void Button_Click()
{
Guid idToSelect = TellMeWhatToSelect();
List<myObject> myDataList = myObjectRepository.RetrieveData().ToList();
myTreeView.Items.Clear();
foreach(myObject o in myDataList)
{
myTreeView.Items.Add(new TreeViewItem() { Content = o.DataField, Tag = o.Id });
}
myTreeView.Items.First(o => ((Guid)(o as TreeViewItem).Tag).Equals(idToSelect)).IsSelected = true;
}
基本上就是这样:我正在将一些数据读入myDataList
,然后循环遍历它并TreeViewItem
根据需要创建尽可能多的 s 以显示数据。
问题是,myTreeView.SelectedItem
在此结束时为空,并且SelectionChanged
未触发事件。我认为,由于Items
集合已被清除并重新填充,IsSelected
打开其中一个项目就像点击一样,但似乎没有)。
奇怪的是(至少对我来说),myTreeView.Items.First().IsSelected = true;
它自己发出(即调用一个带有那一行代码的方法)按预期工作:SelectedItem
是否存在并且所有事件都被适当地触发。
我的代码有什么问题和/或我错过了什么?看起来清理物品会破坏一些东西。
我很确定其他人也有类似的问题,但是我尝试的一堆搜索没有帮助(我提出的大多数信息和问题都与 WPF 相关)。
感谢您的时间,如果需要,我会提供更多信息。另外,对不起文字墙。
更新
像这样修改代码,现在该方法按预期工作。
private void Button_Click()
{
Guid idToSelect = TellMeWhatToSelect();
List<myObject> myDataList = myObjectRepository.RetrieveData().ToList();
myTreeView.Items.Clear();
foreach(myObject o in myDataList)
{
myTreeView.Items.Add(new TreeViewItem() { Content = o.DataField, Tag = o.Id });
}
Dispatcher.BeginInvoke(()=>
{
myTreeView.Items.First(o => ((Guid)(o as TreeViewItem).Tag).Equals(idToSelect)).IsSelected = true;
});
}