#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. Я думаю, что у меня точно такая же проблема! Как вы это сделали?