为什么左键单击使用数据模板创建的树视图项不会选择它们

本文关键字:视图 选择 创建 单击 数据 为什么 | 更新日期: 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中静态设置的,则它只会取消选择,而不是使用ItemsSourceDataTemplate

为什么左键单击使用数据模板创建的树视图项不会选择它们

创建它们?

您是否真的要对固定设备的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不起作用.有关更多选项,请参阅此内容。