Привязка параметра команды контекстного меню к свойству datagrid

В моем XAML файле у меня есть DataGrid с контекстным меню. Источником данных является ViewModel, который имеет свойство EntityCollection (ObservableCollection) в качестве ItemsSource DataGrid и другой коллекции ContextMenu.MenuItems, которая служит источником данных для создания контекстного меню в DataGrid. Элементы этой коллекции имеют свойство Command, которое я привязываю к свойству Command элементов меню:

<DataGrid Name="EntityDataGrid" ItemsSource="{Binding EntityCollection}" Height="450">
  <DataGrid.ContextMenu>
    <ContextMenu ItemsSource="{Binding Path=ContextMenu.MenuItems}">
      <ContextMenu.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
          <Setter Property="Command" Value="{Binding Command}" />
          <Setter Property="CommandParameter"
                  Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" />
        </Style>
      </ContextMenu.ItemContainerStyle>
    </ContextMenu>
  </DataGrid.ContextMenu>
</DataGrid>

Действие для команды элемента меню имеет следующую подпись в ViewModel:

private void SelectedItemsAction(object parameter)
{
    // Do something with "parameter"
}

Теперь моя проблема заключается в том, что я достигаю SelectedItemsAction, когда я нажимаю элемент контекстного меню, но parameter равен null. Я считаю, что моя проблема заключается в настройщике для свойства CommandParameter. Как вы можете видеть, я хочу привязать это свойство к свойству SelectedItems DataGrid, установив значение:

<Setter Property="CommandParameter"
        Value="{Binding ElementName=EntityDataGrid, Path=SelectedItems}" />

Я пробовал более простые значения в качестве теста:

<Setter Property="CommandParameter"
        Value="{Binding ElementName=EntityDataGrid, Path=Height}" />

Здесь parameter все еще null. И тогда просто чтобы проверить, достигает ли какой-либо параметр мой метод действия:

<Setter Property="CommandParameter"
        Value="10" />

Это работает, parameter в моем методе действий теперь действительно 10.

Что я делаю неправильно, чтобы привязать значение CommandParameter к свойству EntityDataGrid? Возможно ли вообще?

Благодарим вас за помощь!

Ответы

Ответ 1

Вы пытались сделать привязку предков? Что-то вроде:

<Setter Property="CommandParameter"
        Value="{Binding Path=SelectedItems, 
        RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />

Ответ 2

ContextMenu не находится в той же части визуального дерева, поэтому вы не можете использовать ElementName и т.д. для ссылки на DataGrid. Вы должны использовать PlacementTarget для ContextMenu. Попробуй так:

<ContextMenu ItemsSource="{Binding Path=ContextMenu.MenuItems}">
    <ContextMenu.ItemContainerStyle>
        <Style TargetType="{x:Type MenuItem}">
            <Setter Property="Command" Value="{Binding Command}" />
            <Setter Property="CommandParameter"
                    Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type ContextMenu}},
                                    Path=PlacementTarget.SelectedItems}" />
        </Style>
    </ContextMenu.ItemContainerStyle>
</ContextMenu>