2017-01-11 11 views
3

Ich möchte column Index bekommen und es durch CommandParameter übergeben Ich habe, in einer context menu für Data grid column header.Wie erhalten Sie Data Grid Spaltenindex auf Rechtsklick? 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> 

Ich habe versucht, indem Binding in CommandParameter das gesamte Objekt zu übergeben, aber es geht nur den Kopftext.

Und versuchte mit RelateveSource AncestorType=DataGridColumn noch konnte es nicht herausfinden.

Edit:

Datagrid-Code:

<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

Was binden Sie auch an Ihr Datagrid und Spalten? – Vijay

Antwort

4

Dies geschieht wahrscheinlich wegen ContextMenu in getrennten VisualTree (korrigiert mich wenn ich falsch bin) gehalten. Bitte benutzen Sie den Code unten DisplayIndex zu bekommen,

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

i PlacementTarget von ContextMenu zugegriffen haben.

+0

Danke, es funktioniert perfekt :) – IBRA

+0

willkommen:) ..... – WPFUser