以编程方式将特定TreeViewItem选择为未绑定的TreeView

时间:2012-04-11 12:30:26

标签: c# silverlight treeview code-behind

在我的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以显示数据。

问题是,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;
    });
}

2 个答案:

答案 0 :(得分:1)

Dispatcher.BeginInvoke内设置属性IsSelected

答案 1 :(得分:0)

前一段时间我遇到了同样的问题,在将TreeViewItem设置为选中之前,我已经通过从树视图调用UpdateLayout方法解决了这个问题。就像这样:

 myTreeView.UpdateLayout();   
 myTreeView.Items.First(o => ((Guid)(o as TreeViewItem).Tag).Equals(idToSelect)).IsSelected = true;