将上下文菜单命令参数绑定到datagrid属性

时间:2011-01-25 23:00:44

标签: .net wpf binding wpfdatagrid

在我的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"
}

现在我的问题是,当我点击上下文菜单项但SelectedItemsActionparameter时,我到达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的属性,我做错了什么?它有可能吗?

提前感谢您的帮助!

2 个答案:

答案 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}}}" />