Какой элемент был выбран в моем TreeView

#c# #wpf #xaml #recursion #treeview

#c# #wpf #xaml #рекурсия #просмотр дерева

Вопрос:

В моем приложении я создаю TreeView с помощью привязки. ItemSource содержит список элементов типа X.
X имеет свойство «Свойства», некоторые из этих свойств являются ссылками на элемент в родительском списке.

Просмотр дерева начинается с выбранного корня (элемента из списка). Все свойства, которые являются ссылками, добавляются к этому корню как TreeViewItems. Однако они также могут быть расширены до тех пор, пока не будет достигнут конец, или нет; Я имею в виду, что теоретически это может быть бесконечной рекурсией, поскольку возможно, что ссылка ссылается на саму себя.

Теперь вопрос в том, как мне узнать, какой элемент выбран?
Мне нужно знать уровень и всех его родителей.

Я придумал эти вещи:

  • При расширении дерева следите за уровнями и родительскими элементами.
    Очевидно, это не работает, потому что после выбора другого элемента под другим родительским элементом я теряю другой путь.
  • Проверьте e.OldValue . Это также не работает по той же причине, что и в предыдущей попытке.
  • При расширении (и создании) TreeView создайте в c # за кодом переменную, подобную TreeView.
    Сначала это кажется довольно близким к решению, поскольку вы не можете удалять узлы из созданных ими TreeView. Например: вы переходите на 5-й уровень и сворачиваете первый уровень. Если вы развернете первый уровень, вы увидите путь точно такой же, как и до свертывания.

Чтобы создать TreeView таким образом, мне пришлось переопределить DataTemplateSelector . (C #)

 public class TreeViewDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;
        if (element != null amp;amp; item != null)
        {
            if (item is Entity)
                return element.FindResource("XTemplate") as DataTemplate;
            else
                return element.FindResource("PropertyWithReferenceTemplate") as DataTemplate;
        }
        return null;
    }
}
  

Привязка и HierarachialDataTemplate. (Xaml)

 <TreeView ItemsSource="{Binding ElementName=view, Path=XDefinition}" ItemTemplateSelector="{StaticResource treeViewDataTemplateSelector}"  SelectedItemChanged="TreeView_SelectedItemChanged">
    <TreeView.Resources>
        <HierarchicalDataTemplate x:Key="XTemplate" ItemsSource="{Binding Path=Properties}">
            <TextBlock Text="{Binding Path=Name}" />                            
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate x:Key="PropertyWithReferenceTemplate" ItemsSource="{Binding Path=ReferenceToX.Properties,}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>
  

Кто-нибудь может мне помочь в этой проблеме?

Если есть что-то еще, что вам нужно знать, пожалуйста, сообщите мне, и я обновлю свой вопрос.

Решение Мне пришлось изменить мое событие SelectedItemChanged=»TreeView_SelectedItemChanged» на TreeViewItem.Выбранный =»TreeViewItem_Selected». С помощью LogicalTreeHelper.getParent я смог получить правильный родительский элемент.

Ответ №1:

Как насчет поиска VisualTree? Вы можете идти вверх, пока не дойдете до верхнего элемента. Прежде чем вы сможете оценить все отдельные элементы.

Комментарии:

1. Я попробовал VisualTree, но это было нечто большее, чем просто получение родительского элемента. В конце концов мне это удалось. Я приму ваш ответ.

2. Я думаю, что у меня точно такая же проблема! Как вы это сделали?