TreeView.ItemContainerGenerator.ContainerFromItem为非根项目返回null。解决方法?

时间:2009-10-06 13:53:16

标签: c# wpf xaml treeview

在下面的示例中,当我选择“String”时,窗口的标题变为“null”。但我必须获取“String”的容器。具体来说,我想做相当于SelectedItem = null(但该属性只读TreeView,所以我试图到容器将其IsSelected设置为{{1 }})。怎么办?

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>

1 个答案:

答案 0 :(得分:10)

问题是每个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";
}