将上下文菜单命令参数绑定到datagrid属性
问题描述:
在我的XAML文件中,我有一个带上下文菜单的DataGrid。数据源是ViewModel,它具有属性EntityCollection
(一个ObservableCollection)作为DataGrid的ItemsSource,另一个集合ContextMenu.MenuItems
作为数据源在DataGrid上创建上下文菜单。该集合的元素有我绑定到菜单项的命令属性Command
属性:将上下文菜单命令参数绑定到datagrid属性
<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>
菜单项命令的行动已在视图模型以下特征:
private void SelectedItemsAction(object parameter)
{
// Do something with "parameter"
}
现在我的问题是,当我点击一个上下文菜单项时,我达到SelectedItemsAction
,但parameter
是null
。我相信我的问题在于CommandParameter
属性的设置者。正如你所看到的,我想通过将该值设置为这个属性到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
的属性?它有可能吗?
感谢您提前帮忙!
答
你有没有尝试做一个祖先绑定?喜欢的东西:
<Setter Property="CommandParameter"
Value="{Binding Path=SelectedItems,
RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}" />
答
的ContextMenu
是不是在视觉树的同一部分,所以这就是为什么你不能使用的ElementName等引用DataGrid
。您必须改用ContextMenu
的PlacementTarget
。尝试像这样
<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>
很好,谢谢你,这个作品! (现在我只需要多读一点关于WPF绑定的内容,以了解您的代码的确在做什么;)) – Slauma 2011-01-26 11:31:32
它正在树上找到与该类型匹配的项目。第一个它使用它作为绑定上下文。 – CodeWarrior 2011-01-26 14:22:08