DataGrid行上的ContextMenu命令不起作用

问题描述:

我创建的样式比我将它绑定到DataGrid.RowStyle 样式。出现ContextMenu,我可以从菜单项中进行选择,但不会执行命令。我用其他控制器测试了命令并且工作正常。DataGrid行上的ContextMenu命令不起作用

<Style x:Key="DataGridRow" TargetType="{x:Type DataGridRow}"> 
    <Setter Property="ContextMenu"> 
     <Setter.Value> 
       <ContextMenu DataContext="{Binding PlacementTarget.DataContext, RelativeSource={RelativeSource Self}}"> 
        <MenuItem Header="Add" Command="{Binding AddMessageContextMenu_Command}"/> 
        <MenuItem Header="Edit" Command="{Binding EditMessage_Command}"/> 
       </ContextMenu> 
      </Setter.Value> 
    </Setter> 
<Style> 

<DataGrid Name="SearchTableDataGrid" ItemsSource="{Binding SearchTableDataGrid_ItemSource}" 
    <DataGrid.RowStyle> 
    <Style TargetType="{x:Type DataGridRow}"> 
      <Style.Triggers> 
      <Trigger Property="AlternationIndex" Value="0"> 
        <Setter Property="Background" Value="#FBFCFC" /> 
       </Trigger> 
       <Trigger Property="AlternationIndex" Value="1"> 
        <Setter Property="Background" Value="#f6f8f8" /> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.RowStyle> 
</DataGrid> 
+0

相关链接:http://*.com/questions/15033522/wpf-contextmenu-woes-how-do-i-set-the- datacontext-of-the-contextmenu – Jose

+0

我使用了标签但命令仍然没有执行。 –

+0

您需要使用visual studio 2015中的工具或类似Snoop的工具在运行时检查绑定。 – Will

您需要对正确的DataContext进行引用。正如评论中所建议的那样,您可以使用此行的Tag行属性。

下面代码即可获得到Windows的DataContext

<Style TargetType="{x:Type DataGridRow}"> 
    <Setter Property="Tag" 
      Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type Window}}, 
          Path=DataContext}"/> 
    <Setter Property="ContextMenu"> 
     <Setter.Value> 
      <ContextMenu DataContext="{Binding PlacementTarget.Tag, 
               RelativeSource={RelativeSource Self}}"> 
       <MenuItem Header="Add" Command="{Binding AddMessageContextMenu_Command}"/> 
       <MenuItem Header="Edit" Command="{Binding EditMessage_Command}"/> 
      </ContextMenu> 
     </Setter.Value> 
    </Setter> 
</Style> 
+0

谢谢,我宣布了一个不同的** RelativeSource **。现在它绑定到正确的命令。 –