在WPF的TreeViewItem中设置SelectionActive

3
如何使TreeViewItem处于活动状态?我只能使用以下代码将其选中:
treeViewItem.IsSelected = true;

我尝试这样做:
treeViewItem.Focus()

但是它没有起作用

如何使这个treeViewItem处于活动和选定状态?

这是我的treeView代码:

foreach(MyData dt in rootdata)
{
   TreeViewItem root = new TreeViewItem()
   root.IsExpanded = true;
   root.Header = dt .DataHeader;
   treeView.Items.Add(root);

   foreach(AnotherData dat in parentData)
   {
       TreeViewItem parent = new TreeViewItem()
       parent .IsExpanded = true;
       parent .Header = dat .DataHeader;
       root.Items.Add(parent);    

       foreach(AnotherData dat in childData)
       {
          TreeViewItem Child = new TreeViewItem()
          Child.IsExpanded = true;
          Child.Header = dat.DataHeader;


          if(this treeViewItem should be selected) 
          {
              child.IsSelected = true;
              child.Focus();
          }
           parent.Items.Add(Child);  
       }
   }
}

你确定你正在调用 "treeViewItem.IsSelected" 吗? - Rohit
是的,我已经在Xaml中为IsSelectionActive设置了触发器,我可以看到是否选择了此项或处于活动状态。 - Timur Mustafaev
1个回答

2
这要看情况。你是如何获取你的TreeViewItem对象,树的结构是怎样的(层次结构),以及树是如何被填充的?
是否使用了数据绑定,TreeviewItem是否可见(不在折叠项内)?这是一段我用来选择和展开给定XML节点的代码。
private void SetSelected(XmlNode node)
{
    Stack<XmlNode> path = new Stack<XmlNode>();

    XmlDataProvider dp = FindResource("xml") as XmlDataProvider;
    XmlNode root = dp.Document.LastChild;

    XmlNode n1 = node;

    //path.Push(node);
    while (n1.ParentNode != root)
    {
        n1 = n1.ParentNode;
        if (n1 == null)
            return;
        path.Push(n1);
    }
    path.Push(root);

    ItemsControl control = tree;
    foreach (XmlNode n in path)
    {

        TreeViewItem tviItem = control.ItemContainerGenerator.ContainerFromItem(n) as TreeViewItem;
        tviItem.IsExpanded = true;
        tviItem.UpdateLayout();
        control = tviItem;
    }

    TreeViewItem resultItem = control.ItemContainerGenerator.ContainerFromItem(node) as TreeViewItem;
    resultItem.IsSelected = true;
    resultItem.Focus();
}

XAML:

<XmlDataProvider x:Key="xml"/> 
<TreeView ItemsSource="{Binding Source={StaticResource xml}}" x:Name=tree/>

这段代码的作用是首先从所选节点找到到根的路径。 (如果您有TreeViewItem而不是XmlNode或任何其他对象,则此方法也适用,只需使用item.Parent代替n1.ParentNode)。 然后从根开始,展开所有节点并更新布局(重要)。 最后,将所选节点设置为IsSelected = true并获得焦点。

我的TreeView已展开,我像这样创建了我的TreeViewItem: TreeViewItem item = new TreeViewItem(); - Timur Mustafaev
你如何填充树? - AkselK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接