TreeView.ItemContainerGenerator.ContainerFromItem возвращает значение NULL для не корневых элементов. Обходной путь? - PullRequest
6 голосов
/ 06 октября 2009

В следующем примере, когда я выбираю «Строка», заголовок окна становится «нулевым». Но я должен получить контейнер "String". В частности, я хочу сделать эквивалент SelectedItem = null (но это свойство доступно только для чтения TreeView, поэтому я пытаюсь добраться до контейнера, чтобы установить для IsSelected значение false). Что делать?

<Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <Window.Resources>
        <x:Array xmlns="clr-namespace:System;assembly=mscorlib" x:Key="Array" Type="Object">
            <x:ArrayExtension Type="Object">
                <String>String</String>
            </x:ArrayExtension>
        </x:Array>
    </Window.Resources>
    <TreeView ItemsSource="{StaticResource Array}" SelectedItemChanged="Handler">
        <TreeView.ItemTemplate>
            <HierarchicalDataTemplate ItemsSource="{Binding}">
                <TextBlock Text="Array"/>
                <HierarchicalDataTemplate.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding}"/>
                    </DataTemplate>
                </HierarchicalDataTemplate.ItemTemplate>
            </HierarchicalDataTemplate>
        </TreeView.ItemTemplate>
    </TreeView>

namespace WpfApplication1
{
    public partial class Window1 : Window
    {
        public Window1()
        {
            InitializeComponent();
        }

        private void Handler(object sender, EventArgs e)
        {
            var treeView = sender as TreeView;
            var container = treeView.ItemContainerGenerator.ContainerFromItem(treeView.SelectedItem);
            Title = container != null ? container.ToString() : "null";
        }
    }
}

1 Ответ

10 голосов
/ 06 октября 2009

Проблема в том, что каждый TreeViewItem сам по себе является ItemsControl, поэтому каждый из них управляет своими собственными контейнерами для своих детей.

Однако, есть очень простой способ сделать то, что вы хотите сделать: вместо регистрации на событие SelectedItemChanged, зарегистрируйтесь на событие TreeViewItem.Selected, которое будет всплывать с OriginalSource, установленным для выбранного TreeViewItem.

XAML:

<TreeView ItemsSource="{StaticResource Array}" TreeViewItem.Selected="TreeViewItem_Selected">

Код:

private void TreeViewItem_Selected(object sender, RoutedEventArgs e) {
    TreeViewItem container = (TreeViewItem) e.OriginalSource;
    Title = container != null ? container.ToString() : "null";
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...