如何从代码中选择TreeView项

Ser*_*jev 28 wpf treeview

我有一个三级树视图.如何从代码中选择第三级中的任何项目?我尝试了许多博客和stackoverflow中提到的方法,但它似乎只适用于第一级(对于第一级以下的项目,dbObject为null).

这是我用来选择TreeViewItem的代码.我错过了什么吗?

public static void SetSelectedItem(this TreeView control, object item)
{
    try
    {
        var dObject = control.ItemContainerGenerator.ContainerFromItem(item);

        //uncomment the following line if UI updates are unnecessary
        ((TreeViewItem)dObject).IsSelected = true;

        MethodInfo selectMethod = typeof(TreeViewItem).GetMethod("Select",
            BindingFlags.NonPublic | BindingFlags.Instance);

        selectMethod.Invoke(dObject, new object[] { true });
    }
    catch { }
}
Run Code Online (Sandbox Code Playgroud)

And*_*ndy 33

另一种选择是使用绑定.如果您有一个使用绑定的对象来获取每个对象的文本TreeViewItem(例如),则可以创建一个也绑定该IsSelected属性的样式:

<TreeView>
    <TreeView.Resources>
        <Style TargetType="TreeViewItem">
            <Setter Property="IsSelected"
                    Value="{Binding Path=IsSelected, Mode=TwoWay}" />
        </Style>
    </TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)

这假设绑定对象具有IsSelected类型的属性bool.然后,您可以选择TreeViewItem通过设置IsSelectedtrue其相应的对象.

可以使用相同的方法与IsExpanded属性一起控制何时TreeViewItem展开或折叠.


kbi*_*ang 8

您可以使用以下TreeView扩展名,我发现这是一个更简单的解决方案:

public static class TreeViewExtension
{
    public static bool SetSelectedItem(this TreeView treeView, object item)
    {
        return SetSelected(treeView, item);
    }

    private static bool SetSelected(ItemsControl parent, object child)
    {
       if (parent == null || child == null)
          return false;

       TreeViewItem childNode = parent.ItemContainerGenerator
       .ContainerFromItem(child) as TreeViewItem;

       if (childNode != null)
       {
          childNode.Focus();
          return childNode.IsSelected = true;
       }

       if (parent.Items.Count > 0) 
       {
          foreach (object childItem in parent.Items)
          {
             ItemsControl childControl = parent
               .ItemContainerGenerator
               .ContainerFromItem(childItem) 
               as ItemsControl;

             if (SetSelected(childControl, child))
               return true;
          }
       }

      return false;
   }
}
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请阅读此博客文章; http://decompile.it/blog/2008/12/11/selecting-an-item-in-a-treeview-in-wpf/