在分层树视图中获取 selectedItem 的类型

Get type of selectedItem in hierarchical treeview

我有一个分层树视图,其中包含绑定到不同级别的多种类型的项目。我需要知道选择了什么类型的项目。项目的类型将决定菜单在应用程序其他地方的可见性。

我知道我不能给分层项目命名,否则这将是理想的。

分层树视图:

<TreeView x:Name="MainTreeView">
    <TreeViewItem x:Name="RobotTreeViewItemOwner" Header="Robots" ItemsSource="{Binding Robots}">
        <TreeViewItem.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:Robot}" ItemsSource="{Binding Processes}">
            </HierarchicalDataTemplate>
        </TreeViewItem>
    </TreeViewItem>
    <TreeViewItem x:Name="BookTreeViewItemOwner" Header="Books" ItemsSource="{Binding Books}">
        <TreeViewItem.Resources>
            <HierarchicalDataTemplate DataType="{x:Type local:Book}" ItemsSource="{Binding Pages}">
            </HierarchicalDataTemplate>
        </TreeViewItem>
    </TreeViewItem>
</TreeView>

以下代码绑定的级别比我要查找的级别高。有没有办法为实际的机器人或书籍物品复制这个?

<MenuItem DataContext="{Binding ElementName=BookTreeViewItemOwner}" Header="Print Book" Visibility="{Binding IsSelected, Converter={StaticResource IsBook}}" />

绑定到 Treeview 根目录下的 SelectedItem 并使用转换器检查类型是否正确。

<MenuItem Header="Print Book" Visibility="{Binding ElementName=MainTreeView, Path=SelectedItem, Converter={StaticResource IsBookSelectedConverter}}"/>

转换器的代码段

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (value is Book)
    {
        return true;
    }
    return false;
}

您可以通过监听 TreeView (https://msdn.microsoft.com/en-us/library/system.windows.controls.treeview.selecteditemchanged%28v=vs.110%29.aspx) 的 SelectedItemChanged 事件来解决这个问题。

private void SelectionChanged(object sender,    RoutedPropertyChangedEventArgs<Object> e)
{
    TreeViewItem selectedItem =e.NewValue as TreeViewItem
    // Inspect to get the type of the selected item and update your menus
}

这将允许您以编程方式根据需要进行调用以设置菜单可见性。