Ответ 1
Вы пытались сделать привязку предков? Что-то вроде:
<Setter Property="CommandParameter"
Value="{Binding Path=SelectedItems,
RelativeSource={RelativeSource AncestorType={x:Type 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
? Возможно ли вообще?
Благодарим вас за помощь!
Вы пытались сделать привязку предков? Что-то вроде:
<Setter Property="CommandParameter"
Value="{Binding Path=SelectedItems,
RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
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>