WPF ItemsControl получает контейнер из объекта данных (TreeView, Multiselect) - PullRequest
2 голосов
/ 25 марта 2011

Как я могу получить Контейнер для объекта в WPF ItemsControl.

Я пишу многоэлементное дерево с привязываемыми свойствами SelectedItem и SelectedItems. Пока все работает просто отлично. Единственное, когда я нажимаю на элемент в дереве с нажатой клавишей Ctrl второй раз, этот элемент должен быть выбран не последним, а последним выбранным элементом. TreeView содержит закрытый метод ChangeSelection. Насколько я понимаю, первым параметром является Контейнер, вторым является TreeViewItem и последний, в зависимости от того, будет ли выбран элемент или нет.

Я реализую множественный выбор с перехватом события SelectedItemChanged.

Этот код работает для нового выбранного элемента

private void OnSelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
{
    var view = ItemContainerGenerator.ContainerFromItem(e.NewValue) as TreeViewItem;
    // ...
}

НО, если я хочу получить TreeViewItem из элемента, сохраненного в ObservableCollection ... он не будет работать.

РЕДАКТИРОВАТЬ: Хорошо, как я узнал. Код выше работает только для предметов первого уровня ...

1 Ответ

0 голосов
/ 29 марта 2011

РЕДАКТИРОВАТЬ: решение этой проблемы не тривиально. Можно найти выбранный элемент древовидной структуры с помощью модели представления (например, интерфейса, который обеспечивает основы, такие как: IsSelected, IsExpanded, IsEnabled и Parent). Вы можете искать TreeViewItem следующим образом:

if (treeViewItem.ItemContainerGenerator.Status != GeneratorStatus.ContainersGenerated)
{
    EventHandler eventHandler = null;

    eventHandler = delegate
    {
        treeViewItem.ItemContainerGenerator.StatusChanged -= eventHandler;
        // Call the search function recursive XYZ(tree, treeViewItem.ItemContainerGenerator.ContainerFromItem(nextLevelItem) as TreeViewItem);
    };

    // wait for the containers to be generated
    treeViewItem.ItemContainerGenerator.StatusChanged += eventHandler;
}
else
{
    // Call the search function recursive XYZ(tree, treeViewItem.ItemContainerGenerator.ContainerFromItem(nextLevelItem) as TreeViewItem);
}
...