2017-01-11 29 views
3

我想获得column Index并通过CommandParameter我有,context menuData grid column header如何获得数据网格列索引右键单击? MVVM WPF

<DataGrid.Resources> 
    <ContextMenu x:Key="DataGridColumnHeaderContextMenu"> 
      <MenuItem Header="Freez Column" 
        Command="{Binding DataContext.FreezColumnCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" 
        CommandParameter="{Binding}" /> 
    </ContextMenu> 
    <Style TargetType="{x:Type DataGridColumnHeader}"> 
      <Setter Property="ContextMenu" Value="{StaticResource DataGridColumnHeaderContextMenu}" /> 
    </Style> 
</DataGrid.Resources> 

我试着在CommandParameter传递Binding传递整个对象,但它只能通过标题文本。

并尝试使用RelateveSource AncestorType=DataGridColumn仍然无法弄清楚。

编辑:

的DataGrid代码:

<DataGrid ItemsSource="{Binding MyList}" HorizontalScrollBarVisibility="Visible" CanUserAddRows="False" AutoGenerateColumns="False"> 
    <DataGrid.Resources> 
      <ContextMenu x:Key="DataGridColumnHeaderContextMenu"> 
       <MenuItem Header="Freez Column" 
         Command="{Binding DataContext.FreezColumnCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" 
         CommandParameter="{Binding}" /> 
      </ContextMenu> 
      <Style TargetType="{x:Type DataGridColumnHeader}"> 
       <Setter Property="ContextMenu" Value="{StaticResource DataGridColumnHeaderContextMenu}" /> 
      </Style> 
    </DataGrid.Resources> 
    <DataGrid.Columns> 
      <DataGridTextColumn Header="Story" Binding="{Binding Story}" /> 
      <DataGridCheckBoxColumn Header="Design" Binding="{Binding Design}" /> 
      <DataGridTextColumn Header="CadId" Binding="{Binding CadId}" /> 
    </DataGrid.Columns> 
</DataGrid> 
+0

什么你绑定到你的Datagrid和列以及? – Vijay

回答

4

这可能发生,因为的ContextMenu保持在单独VisualTree(纠正我,如果我错了)。请使用下面的代码来获得DisplayIndex

<DataGrid 
     x:Name="myGrid" 
     AutoGenerateColumns="False" 
     CanUserAddRows="False" 
     HorizontalScrollBarVisibility="Visible" 
     ItemsSource="{Binding Persons}"> 
     <DataGrid.Resources> 
      <local:GridToIndexConverter x:Key="GridToIndexConverter" /> 
      <ContextMenu x:Key="DataGridColumnHeaderContextMenu"> 
       <MenuItem 
        Command="{Binding DataContext.FreezColumnCommand, RelativeSource={RelativeSource AncestorType=DataGrid}}" 
        CommandParameter="{Binding PlacementTarget.DisplayIndex, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=ContextMenu}}" 
        Header="Freez Column" /> 
      </ContextMenu> 
      <Style TargetType="{x:Type DataGridColumnHeader}"> 
       <Setter Property="ContextMenu" Value="{StaticResource DataGridColumnHeaderContextMenu}" /> 
      </Style> 
     </DataGrid.Resources> 
     <DataGrid.Columns> 
      <DataGridTextColumn Binding="{Binding Story}" Header="Story" /> 
      <DataGridCheckBoxColumn Binding="{Binding Design}" Header="Design" /> 
      <DataGridTextColumn Binding="{Binding CadId}" Header="CadId" /> 
     </DataGrid.Columns> 
    </DataGrid> 

我访问过的ContextMenuPlacementTarget

+0

谢谢,它完美的作品:) – IBRA

+0

欢迎:)..... – WPFUser