我有一个分层树视图,其中多种类型的项目绑定到不同的级别。我需要知道选择了什么类型的项目。项目类型将决定应用程序中其他位置菜单的可见性。
我知道我不能给分层项目命名,否则这将是理想的。
分层树视图:
<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}}" />
答案 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
}
这将允许您以编程方式调用以根据需要设置菜单可见性。