Какой элемент был выбран в моем TreeView - PullRequest
0 голосов
/ 28 сентября 2011

В моем приложении я строю 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 я смог найти правильного родителя.

1 Ответ

1 голос
/ 28 сентября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...