繁体   English   中英

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

[英]Programmatically select a specific TreeViewItem into an unbound TreeView

在我的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 ,然后循环浏览并根据需要创建myDataList多个TreeViewItem ,以显示数据。

问题是, myTreeView.SelectedItem在此末尾为null,并且不会触发SelectionChanged事件。 我认为,由于已清除并重新填充了Items集合, IsSelected在其中一项上切换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设置为selected之前从树视图调用UpdateLayout方法。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM