在下面的示例中,当我选择“String”时,窗口的标题变为“null”。但我必须获得“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";
}
}
}
最佳答案
问题是每个 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/