在我的XAML文件中,我有一个带有上下文菜单的DataGrid。数据源是一个ViewModel,它具有一个属性EntityCollection
(一个ObservableCollection)作为DataGrid的ItemsSource,另一个集合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
属性的setter中。如您所见,我想通过将值设置为以下内容将此属性绑定到DataGrid的SelectedItems
属性:
<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
的属性,我做错了什么?它有可能吗?
提前感谢您的帮助!
答案 0 :(得分:14)
ContextMenu
不在Visual Tree的同一部分中,因此您无法使用ElementName等来引用DataGrid
。您必须使用PlacementTarget
的{{1}}代替。试试这个
ContextMenu
答案 1 :(得分:8)
您是否尝试过祖先绑定?类似的东西:
<Setter Property="CommandParameter"
Value="{Binding Path=SelectedItems,
RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />