2012-08-07 57 views
0

我试图通过名称将元素绑定到ContextMenu中的MenuItem。元素绑定:与名称绑定的上下文菜单

<UserControl x:Class="ATCheckerView.TestsPropagate" 
     x:Name="TestPropagateRoot" ... 

工作版本:

非工作:

  <HierarchicalDataTemplate x:Key="SchemTemplate">     
      <TextBlock Text="{Binding path}"> 
       <TextBlock.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="{Binding ElementName=TestPropagateRoot}" 
            Command="{Binding ElementName=TestPropagateRoot, Path=DataContext.vclient.OpenInViewer}" 
            CommandParameter="{Binding}" /> 
        </ContextMenu> 
       </TextBlock.ContextMenu> 
      </TextBlock> 
     </HierarchicalDataTemplate> 

回答

1

here是一个类似的问题和良好的答案,显示出某些方面如何处理文本菜单结合。

btw is use PlacementTarget绑定大部分时间,例如

 <TextBlock Text="{Binding path}"> 
      <TextBlock.ContextMenu> 
       <ContextMenu> 
        <MenuItem Header="Test" 
           Command="{Binding Path=PlacementTarget.DataContext.vclient.OpenInViewer, 
               RelativeSource={RelativeSource AncestorType=ContextMenu}}" 
           CommandParameter="{Binding}" /> 
       </ContextMenu> 
      </TextBlock.ContextMenu> 
     </TextBlock> 

编辑:{X:参考TestPropagateRoot}还可以,如果你使用选项.net4.0

+0

的TextBlock和文本菜单和菜单项的最初的DataContext相同。所以你的命令的绑定没有意义。 – psct 2012-08-07 14:10:59

0

我的解决办法是:

<HierarchicalDataTemplate x:Key="SchemTemplate"> 
      <TextBlock Text="{Binding path}" 
         Tag="{Binding DataContext, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type local:TestsPropagate}}}"> 
       <TextBlock.ContextMenu> 
        <ContextMenu> 
         <MenuItem Header="Открыть для просмотра" 
            Command="{Binding Path=PlacementTarget.Tag.vclient.OpenInViewer, 
          RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" 
            CommandParameter="{Binding}" />          
        </ContextMenu> 
       </TextBlock.ContextMenu> 
      </TextBlock> 
</HierarchicalDataTemplate>