Привязка параметра команды контекстного меню к свойству сетки данных - PullRequest
13 голосов
/ 26 января 2011

В моем файле 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? Возможно ли это вообще?

Заранее спасибо за помощь!

Ответы [ 2 ]

14 голосов
/ 26 января 2011

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>
8 голосов
/ 26 января 2011

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

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