2016-09-26 2 views
2

У меня есть дерево с иерархическим шаблоном данных, и я пытаюсь установить DataContext для ContextMenu, поэтому я мог бы связывать с ним команды. Я провел исследование и знаю, что ContextMenu не наследует DataContext своего родителя. Я старался следить за этими сообщениями: How to set the RelativeSource in a DataTemplate that is nested in a HierarchicalDataTemplate?Команда bind contextmenu в древовидном представлении с шаблоном иерархических данных

How to bind to the DataContext of a HierarchicalDataTemplate from its ItemTemplate XAML? но все еще не может заставить его работать. Любая помощь будет оценена по достоинству. Вот мой пример кода:

<TreeView.Resources> 
    <HierarchicalDataTemplate DataType="{x:Type viewModels:SiteViewModel}" ItemsSource="{Binding Children}"> 
     <StackPanel Orientation="Horizontal"> 
      <StackPanel.Resources> 
      </StackPanel.Resources> 
      <Image Width="16" Height="16" Margin="3,0" /> 
      <TextBlock Text="{Binding SiteName}" /> 
     </StackPanel> 
    </HierarchicalDataTemplate> 


    <HierarchicalDataTemplate DataType="{x:Type viewModels:LevelViewModel}" ItemsSource="{Binding Children}" > 
     <StackPanel Orientation="Horizontal" > 
      <Image Width="16" Height="16" Margin="3,0" /> 
      <TextBlock Text="{Binding LevelName}" > 
       <TextBlock.ContextMenu > 
       <ContextMenu> 
        <MenuItem Header="Test" Command="{Binding ?????????" CommandParameter="{Binding}"/> 
       </ContextMenu> 
       </TextBlock.ContextMenu> 
      </TextBlock> 
     </StackPanel> 
    </HierarchicalDataTemplate> 

ответ

0

Один из способов решить эту проблему: В моем случае у меня было что-то вроде этого:

<DataTemplate DataType="..."> 
       <TreeView> 
        <TreeViewItem Tag="{Binding ElementName=LocalControl, Path=DataContext}" 
            Header="{Binding ...}" 
            ContextMenu="{StaticResource ...}"> 
         ... 
        </TreeViewItem> 
       </TreeView> 
</DataTemplate> 

Вам нужно связать атрибут тега родительского TreeViewItem его DataContext, то где-нибудь в ваших иерархических шаблонах для контекстного меню вы должны привязать свой DataContext к тегу родительского элемента управления:

<ContextMenu x:Key="CyclogramFolderContextMenu" 
         DataContext="{Binding Path=PlacementTarget.Tag, RelativeSource={RelativeSource Self}}"> 
       <TextBlock Text="Do something" > 
        <TextBlock.InputBindings> 
         <MouseBinding Command="{Binding Path=(viewModels:someViewModel.SomeCommand)}" MouseAction="LeftClick" /> 
        </TextBlock.InputBindings> 
       </TextBlock> 
</ContextMenu> 
Смежные вопросы