0
<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>

为什么左键单击使用 DataTemplate 创建的 TreeViewItems 不会选择它们?如果我在代码中选择它们,为什么不能再次选择它们或取消选择它们?

TreeViewItem selectedItem = MyTreeView.SelectedItem as TreeViewItem;
if(selectedItem != null) {
    selectedItem.IsSelected = false;
    MyTreeView.Focus();
}

我尝试使用以下内容TreeViewItemsTreeViewTreeViewItemsItemsSourceDataTemplate

4

2 回答 2

1

当您设置ItemSource与您设置的集合SelectedItemDataContext类型中的类型T相对ItemSource应时,而不是实际的TreeViewItem.

因此为什么你的演员失败了。

现在,当您直接在 xaml 中创建它们而不设置 , 时ItemSourceSelectedItem它只是它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. 有关更多选项,请参阅此内容。

于 2013-07-10T15:02:33.663 回答
1

您是否真的要对TreeViewItem固定设备的模板做一些特别的事情(需要更改TreeViewItem模板?

从表面上看,您似乎可以让TreeView处理自己的项目,只需使用一个简单的模板来表示您的对象:例如

<DataTemplate DataType="{x:Type EntityType:MyFixedDevice}">
    <TextBlock Text="{Binding RelativeSource={RelativeSource Self}, Converter={StaticResource NameConverter}}" />
</DataTemplate>

我可能误解了你想要达到的目标。

于 2013-07-10T15:23:41.837 回答