使用相同的DataContext设置DataGrid和ContextMenu

时间:2015-07-27 13:59:56

标签: wpf mvvm datagrid contextmenu 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> 

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

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

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

谢谢, 尼克

1 个答案:

答案 0 :(得分:1)

您需要绑定到父DataContext.ContextMenuActions的{​​{1}}。 最简单实现此目的的方法是使用以下绑定:

DataGrid