以编程方式将特定的树视图项选择到未绑定的树视图中

本文关键字:视图 选择 绑定 编程 方式 | 更新日期: 2023-09-27 18:30:40

在我的 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在此结束时为 null,并且不会触发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;
    });
}

以编程方式将特定的树视图项选择到未绑定的树视图中

在 Dispatcher.BeginInvoke 中设置属性IsSelected

不久

前我遇到了同样的问题,我已经通过在将 TreeViewItem 设置为选定之前从树视图调用 UpdateLayout 方法来解决。喜欢这个:

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