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

标签 c# wpf xaml treeview

在下面的示例中,当我选择“String”时,窗口的标题变为“null”。但我必须获得“String”的容器。具体来说,我想执行与 SelectedItem = null 相同的操作(但该属性只对 TreeView 是可读的,因此我试图进入容器以设置其 IsSelectedfalse)。怎么办?

<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";
        }
    }
}

最佳答案

问题是每个 TreeViewItem 本身就是一个 ItemsControl,所以它们各自为它们的 child 管理自己的容器。

但是,有一种非常简单的方法可以做您想做的事情:不是注册到 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";
}

关于c# - TreeView.ItemContainerGenerator.ContainerFromItem 为非根项返回 null。解决方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1525736/

相关文章:

wpf - 在 wpf 控件中嵌入谷歌地图

wpf - 查看控件显示/隐藏 WPF MVVM

c# - JavaScript 中必需的文本框

c# - 在数据库访问应用程序中管理并发的最佳方法是什么?

c# - 从顶部将纹理平铺到矩形

c# - 存储用户设置

wpf - 在 DataTemplates 内绑定(bind)时出现“找不到管理 FrameworkElement ...”警告

WPF ListBox 未绑定(bind)到 INotifyCollectionChanged 或 INotifyPropertyChanged 事件

wpf - Generic.xaml 有什么特别之处?

c# - DataGrid 中的 TextWrapping