使用相同的 DataContext 设置 DataGrid 和 ContextMenu

Setting DataGrid and ContextMenu with Same DataContext

我正在尝试为传入所选菜单项 (Mvvm) 的数据网格动态创建上下文菜单。我希望上下文菜单的 DataContext 与网格相同。

我有以下Xaml

<Grid>
  <!-- Cut some other stuff -->
  <Border Grid.Row="2" BorderBrush="Black" BorderThickness="1">
    <DataGrid x:Name="MyDataGrid" IsSynchronizedWithCurrentItem="True" ItemsSource="{Binding Path=GridData}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="None" SelectionUnit="Cell" SelectionMode="Single">
      <DataGrid.ContextMenu>
        <ContextMenu ItemsSource="{Binding ContextMenuActions}">
          <MenuItem Header="{Binding DisplayName}" Command="{Binding Command}" />
        </ContextMenu>
      </DataGrid.ContextMenu>
      <DataGrid.Columns>
        <DataGridTextColumn  Header="DataOne" Width="130" Binding="{Binding Path=DataOne}"/>
        <DataGridTextColumn  Header="DataTwo"   Width="100" Binding="{Binding Path=DataTwo}"/>
      <DataGrid.Columns>
      <DataGrid.InputBindings>
        <MouseBinding Gesture="RightClick"  Command="{Binding DataGridRightClick}" CommandParameter="{Binding ElementName=MyDataGrid, Path=SelectedCells}" />
      </DataGrid.InputBindings>
    </DataGrid>
  </Border>
</Grid> 

和以下 类 用于我的数据网格的数据上下文,也想用于我的上下文菜单(为了便于阅读,我删除了所有数据网格填充代码)和菜单项

public class DataViewModel : ViewModelBase // Implements INotifyPropertyChanged
{
    // All code that populates the grid has been removed

    public ObservableCollection<MenuItemViewModel> ContextMenuActions { get; set; }
    public ICommand DataGridRightClick { get; private set; }

    public MarketDataViewModel()
    {
        DataGridRightClick = new RelayCommand(RightClick);
    }

    public void RightClick(object obj)
    {
        MenuItemViewModel menuItem = new MenuItemViewModel("Test", new RelayCommand(TestCall));
        ContextMenuActions.Add(menuItem); // I ensure this is added on the gui thread
        MenuItemViewModel menuItem1 = new MenuItemViewModel("Test2", new RelayCommand(TestCall));
        ContextMenuActions.Add(menuItem1); // I ensure this is added on the gui thread but for 
    }

    private void TestCall(object obj)
    {
        // want to pass in the selected menuitem
    }
}

public class MenuItemViewModel 
{
    public MenuItemViewModel(string displayName,ICommand command)
    {
        DisplayName = displayName;
        Command = command;
    }

    public string DisplayName { get; set; }
    public ICommand Command { get; set; }
}

目前,当我单击数据网格时,会调用右键单击事件并正常运行,但网格上会出现一个空的上下文菜单。

谢谢, 尼克

您需要绑定到父 DataGridDataContext.ContextMenuActions最简单的方法是使用以下绑定:

<ContextMenu ItemsSource="{Binding DataContext.ContextMenuActions, ElementName=MyDataGrid}" ...