【问题标题】:Getting TreeViewItem for the selected item in a TreeView获取 TreeView 中所选项目的 TreeViewItem
【发布时间】:2011-07-10 06:07:44
【问题描述】:

我有一个绑定到具有父子关系的数据集的 TreeView。我将如何从 TreeView 中获得选中的 TreeViewItem?请帮我。我的代码如下。

xaml:-

<TreeView Name="tvPersonal"  Background="Transparent"  ItemsSource="{Binding RootNodes}" SelectedItemChanged="tvPersonal_SelectedItemChanged">    
 <TreeView.ItemTemplate>
   <HierarchicalDataTemplate ItemsSource="{Binding rsParentChild}">
     <TextBlock Text="{Binding Name}" />
   </HierarchicalDataTemplate>
 </TreeView.ItemTemplate>

 public MainWindow()   

        {    
            InitializeComponent();    
            DataSet ds = new BL.BLMenu().GetAllMenues(new BOModule { Name = Modules.Personnel });
            ds.Tables[0].TableName = "Menu";
            DataRelation relation = new DataRelation("rsParentChild",
                    ds.Tables["Menu"].Columns["MenuId"],
                    ds.Tables["Menu"].Columns["ParentId"]);
            relation.Nested = true;    
            ds.Relations.Add(relation);
            BOMenu mnu = new BOMenu();    
            BOMenu.RootNodes = ds.Tables["Menu"].DefaultView;
            BOMenu.RootNodes.RowFilter = "ParentId IS NULL";    

            this.DataContext = this;
            stbiDate.Content = DateTime.Now;

        }
        public DataView RootNodes    
        {
            get { return BOMenu.RootNodes; }
        }

BOMenu 类:-

 public class BOMenu
    {
        public string MenuId
        {
            get;
            set;
        }

        public string Name
        {
            get;
            set;
        }

        public string ParentId
        {
            get;
            set;
        }

        public int Priority
        {
            get;
            set;
        }

        public static DataView RootNodes
        {
            get;
            set;
        }

    }

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    试试

    TreeViewItem tvi = myTree.ItemContainerGenerator.ContainerFromItem(SelectedItem) as TreeViewItem;
    

    或通过以下链接。希望这会有所帮助

    Data binding to SelectedItem in a WPF Treeview

    Get SelectedItem from TreeView?

    http://social.msdn.microsoft.com/forums/en-US/wpf/thread/36aca7f7-0b47-488b-8e16-840b86addfa3/

    【讨论】:

    • 这不适用于数据源通过HierarchicalDataTemplate 绑定的树。
    • 这种方式拿不到孙子。
    【解决方案2】:

    这适用于数据源通过 HierarchicalDataTemplate 绑定的树

    处理 TreeViewItem.Selected

    <TreeView Name="mTreeView" TreeViewItem.Selected="TreeViewItem_OnItemSelected" />
    

    并将 TreeViewItem 设置为 Tag。

    private void TreeViewItem_OnItemSelected(object sender, RoutedEventArgs e)
    {
        mTreeView.Tag = e.OriginalSource;
    }
    

    以后可以检索到

    TreeViewItem tvi = mTreeView.Tag as TreeViewItem;
    

    【讨论】:

    • 你怎么能用代码写这个TreeViewItem.Selected="TreeViewItem_OnItemSelected"?我正在尝试基于 TreeView 建立一个新控件,并希望在内部而不是在我需要 TreeView 的每个地方进行处理。我似乎无法在任何地方找到可以通过 TreeViewItem 命名空间附加的事件...
    • 您可以在控件的构造函数中这样做:AddHandler(TreeViewItem.SelectedEvent, new RoutedEventHandler(TreeViewItem_Selected)); private void TreeViewItem_Selected(object sender, RoutedEventArgs e) { _selectedTreeViewItem = e.OriginalSource as TreeViewItem; }
    【解决方案3】:

    我发现的最佳解决方案涉及一个简单的辅助方法,几乎​​可以用于 TreeView 的任何事件(即 SelectedItemChanged、MouseLeftButtonUp 等)。

    TreeViewItem Item = TreeViewHelper.VisualUpwardSearch(e.OriginalSource as DependencyObject);
    

    我正在使用多个层次结构数据模板,这是对我有用的唯一方法。现在,我可以创建一个基于 TreeView 的新控件,并且可以在内部处理涉及所选项目的所有事件。

    public static TreeViewItem VisualUpwardSearch(DependencyObject source)
    {
        while (source != null && !(source is TreeViewItem)) source = System.Windows.Media.VisualTreeHelper.GetParent(source);
        return source as TreeViewItem;
    }
    

    【讨论】:

      【解决方案4】:

      虽然 biju 的答案适用于平面层次结构,但我不得不为 HierarchicalDataTemplates 寻找解决方案。这是对我有用的扩展方法:

      public static TreeViewItem ContainerFromItemRecursive(this ItemContainerGenerator root, object item)
      {
          var treeViewItem = root.ContainerFromItem(item) as TreeViewItem;
          if (treeViewItem != null)
              return treeViewItem;
          foreach (var subItem in root.Items)
          {
              treeViewItem = root.ContainerFromItem(subItem) as TreeViewItem;
              var search = treeViewItem?.ItemContainerGenerator.ContainerFromItemRecursive(item);
              if (search != null)
                  return search;
          }
          return null;
      }
      

      你可以使用它

      TreeViewItem tvi = treeView
                             .ItemContainerGenerator
                             .ContainerFromItemRecursive(treeView.SelectedItem);
      

      【讨论】:

      • 看起来这应该可以解决问题! 2012 年我需要这个时你在哪里 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 2011-08-23
      • 2021-12-22
      • 1970-01-01
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多