2015-04-27 2 views
1

У меня есть иерархическое древовидное представление с несколькими типами элементов, привязанных к различным уровням. Мне нужно знать, какой тип элемента выбран. Тип элемента определяет видимость меню в другом месте приложения.Получить тип selectedItem в иерархическом treeview

Я понимаю, что я не могу дать иерархическому элементу имя, иначе это было бы идеально.

Иерархическая 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> 

Следующий код связывает один уровень выше, чем я ищу. Есть ли способ воспроизвести это для фактических элементов Robot или Book?

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

ответ

1

Привязать к SelectedItem в корневой части Treeview и использовать конвертер для проверки правильного типа.

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

Вы могли бы решить эту проблему путем прослушивания события SelectedItemChanged в TreeView (https://msdn.microsoft.com/en-us/library/system.windows.controls.treeview.selecteditemchanged%28v=vs.110%29.aspx).

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 
} 

Это позволит вам программно сделать вызовы для установки видимости меню по мере необходимости.

+0

Согласен, и это было моим первоначальным обходным решением. Однако это добавляет немного дополнительной логики. Эта логика войдет в кодовое слово, которое, как общего принципа, следует избегать. – Brandon

Смежные вопросы