2017-01-11 4 views
3

Je veux obtenir column Index et le passer par CommandParameter J'ai, dans un context menu pour Data grid column header.Comment faire pour obtenir l'index de la colonne Data Grid sur un clic droit? 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> 

J'ai essayé de passer l'ensemble de l'objet en passant Binding dans CommandParameter, mais il ne laisse passer que le texte d'en-tête.

Et essayé d'utiliser RelateveSource AncestorType=DataGridColumn ne pouvait toujours pas comprendre.

Edit:

Code 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

Qu'est-ce que vous avez lié à votre Datagrid et à vos colonnes? – Vijay

Répondre

4

Cela se produit probablement à cause de ContextMenu est maintenue dans VisualTree séparée (corrigez-moi si je me trompe). S'il vous plaît utiliser le code ci-dessous pour obtenir 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> 

j'ai consulté PlacementTarget de ContextMenu.

+0

Merci, cela fonctionne parfaitement :) – IBRA

+0

bienvenue:) ..... – WPFUser