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

时间:2015-04-27 15:53:17

标签: c# xaml 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}}" />

2 个答案:

答案 0 :(得分:1)

绑定到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;
}

答案 1 :(得分:0)

您可以通过侦听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
}

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