为什么左键单击使用数据模板创建的树视图项不会选择它们
本文关键字:视图 选择 创建 单击 数据 为什么 | 更新日期: 2023-09-27 18:22:00
<TreeView Name="MyTreeView" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.VirtualizationMode="Recycling">
<TreeView.ItemsPanel>
<ItemsPanelTemplate>
<VirtualizingStackPanel IsItemsHost="True"/>
</ItemsPanelTemplate>
</TreeView.ItemsPanel>
<TreeView.Resources>
<DataTemplate DataType="{x:Type EntityType:MyFixedDevice}">
<TreeViewItem IsHitTestVisible="True" IsEnabled="True">
<TreeViewItem.Header>
<TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}"
IsHitTestVisible="True" IsEnabled="True"/>
</TreeViewItem.Header>
</TreeViewItem>
</DataTemplate>
</TreeView.Resources>
<TreeView.Items>
<TreeViewItem Header="Data Warehouse">
<TreeViewItem.Items>
<TreeViewItem Header="Platforms">
<TreeViewItem.Items>
<TreeViewItem ItemsSource="{Binding OBJS, Converter={StaticResource COBJSourceConverter}, ConverterParameter=Fixed}">
<TreeViewItem.Header>
<TextBlock Text="{Binding RelativeSource={RelativeSource Self},
Path=Parent.Items.Count,
StringFormat=Fixed Devices ({0})}">
</TextBlock>
</TreeViewItem.Header>
</TreeViewItem>
</TreeViewItem.Items>
</TreeViewItem>
</TreeViewItem.Items>
</TreeViewItem>
</TreeView.Items>
</TreeView>
为什么左键单击使用数据模板创建的树视图项不选择它们?如果我在代码中选择它们,为什么我无法再次选择它们或取消选择它们?
TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem;
if(selectedItem != null) {
selectedItem.IsSelected = false;
MyTreeView.Focus();
}
我尝试使用以下方法取消选择TreeView
中的TreeViewItems
,但是如果TreeViewItems
是在XAML中静态设置的,则它只会取消选择,而不是使用ItemsSource
和DataTemplate
您是否真的要对固定设备的TreeViewItem
模板做一些特别的事情(这需要更改TreeViewItem
模板?
从表面上看,似乎您可以让TreeView
处理自己的项目,只需使用一个简单的模板来表示您的对象:例如
<DataTemplate DataType="{x:Type EntityType:MyFixedDevice}">
<TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}" />
</DataTemplate>
我可能误解了你想要实现的目标。
当您设置ItemSource
时,SelectedItem
对应于您设置的ItemSource
集合的类型T
中的DataContext
类型,而不是实际TreeViewItem
。
因此,您的施法失败的原因。
现在,当您直接在 xaml 中创建它们而不设置ItemSource
时,SelectedItem
只是TreeViewitem
本身,as
强制转换工作正常。
更新:
它与你的DataTemplate
无关
试试这个:
<Window.Resources>
<x:Array x:Key="someArray"
Type="sys:String">
<sys:String>Hello</sys:String>
<sys:String>World</sys:String>
</x:Array>
</Window.Resources>
<StackPanel>
<TreeView x:Name="MyTreeView"
ItemsSource="{DynamicResource someArray}" />
<Button Click="ButtonBase_OnClick"
Content="Some" />
</StackPanel>
和代码隐藏:
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem;
if (selectedItem != null) {
selectedItem.IsSelected = false;
MyTreeView.Focus();
} else {
Debug.WriteLine("Not TreeViewitem");
Debug.WriteLine(MyTreeView.SelectedItem);
}
}
现在,当应用程序运行时,单击一个项目,然后单击Button
检查输出窗口,您将看到
Not TreeViewitem
Hello
DataTemplate
只是帮助可视化视图中的自定义数据类型。这是集合绑定到TreeView
时的预期行为
溶液:
在您的情况下,要获得实际TreeViewItem
请尝试:
private void ButtonBase_OnClick(object sender, RoutedEventArgs e) {
TreeViewItem selectedItem =
MyTreeView.ItemContainerGenerator.ContainerFromItem(MyTreeView.SelectedItem) as TreeViewItem;
if (selectedItem == null)
return;
selectedItem.IsSelected = false;
MyTreeView.Focus();
}
^^这应该对HierarchicalDataTemplate
不起作用.有关更多选项,请参阅此内容。