将上下文菜单命令参数绑定到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,但parameternull。我相信我的问题在于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}}}" /> 
+0

很好,谢谢你,这个作品! (现在我只需要多读一点关于WPF绑定的内容,以了解您的代码的确在做什么;)) – Slauma 2011-01-26 11:31:32

+0

它正在树上找到与该类型匹配的项目。第一个它使用它作为绑定上下文。 – CodeWarrior 2011-01-26 14:22:08

ContextMenu是不是在视觉树的同一部分,所以这就是为什么你不能使用的ElementName等引用DataGrid。您必须改用ContextMenuPlacementTarget。尝试像这样

<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>