Подтвердить что ты не робот

Получение TreeViewItem для выбранного элемента в TreeView

У меня есть TreeView, привязанный к набору данных, который имеет родительское дочернее отношение. Как я получу TreeViewItem из TreeView? Пожалуйста, помогите мне. Мой код ниже.

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;
        }

    }
4b9b3361

Ответ 2

Это работает для деревьев, источник данных которых связан через HierarchicalDataTemplate

Обработать TreeViewItem.Selected

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

И установите TreeViewItem как тег.

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

Что вы можете получить позже

TreeViewItem tvi = mTreeView.Tag as TreeViewItem;

Ответ 3

В то время как ответ 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);

Ответ 4

Лучшее решение, которое я нашел, включает простой вспомогательный метод и может использоваться практически в любом из событий TreeView (т.е. SelectedItemChanged, MouseLeftButtonUp и т.д.).

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

Я использую несколько шаблонов данных иерархии, и это метод only, который работал у меня. Теперь я могу создать новый элемент управления на основе TreeView и может обрабатывать все события, связанные с выбранным элементом внутри.

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