В моем приложении я строю TreeView с помощью привязки. ItemSource содержит список элементов типа X.
X имеет свойство 'Properties', некоторые из этих свойств являются ссылками на элемент в родительском списке.
TreeView начинается с выбранного корня (элемента из списка). Все свойства, которые являются ссылками, добавляются к этому корню как TreeViewItems. Тем не менее, они могут быть расширены до конца или нет; Я имею в виду, что теоретически это может быть бесконечная рекурсия, поскольку возможно, что ссылка ссылается на себя.
Вопрос теперь в том, как узнать, какой предмет выбран?
Мне нужно знать уровень и всех его родителей.
Я придумал эти вещи:
- При расширении дерева следите за уровнями и родителями.
Это не работает, очевидно, потому что после выбора другого элемента ниже другого родителя я теряю след другого пути.
- Проверьте для
e.OldValue
. Это также не работает по той же причине, что и предыдущая попытка.
- При расширении (и с этим созданием) TreeView создайте переменную типа TreeView в c # за кодом.
Поначалу это кажется довольно близким к решению, поскольку вы не можете удалить узлы из TreeView, которые они создали. Например: вы переходите на 5-й уровень и рухнули на первый уровень. Если вы развернете первый уровень, вы увидите, что путь точно такой же, как и перед развалом.
Чтобы создать TreeView таким образом, мне пришлось переопределить DataTemplateSelector. (С #)
public class TreeViewDataTemplateSelector : DataTemplateSelector
{
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
FrameworkElement element = container as FrameworkElement;
if (element != null && item != null)
{
if (item is Entity)
return element.FindResource("XTemplate") as DataTemplate;
else
return element.FindResource("PropertyWithReferenceTemplate") as DataTemplate;
}
return null;
}
}
Шаблон Binding и 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.Selected = "TreeViewItem_Selected". С помощью LogicalTreeHelper.GetParent я смог найти правильного родителя.