2017-01-11 8 views
3

Я хочу получить column Index и передать его CommandParameter У меня есть, в context menu для Data 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> 

Я пытался передать весь объект, передавая Binding в CommandParameter, но она проходит только текст заголовка.

И попытался использовать RelateveSource AncestorType=DataGridColumn, все еще не мог понять это.

Edit:

код 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> 

я обращался PlacementTarget из ContextMenu.

+0

Спасибо, он отлично работает :) – IBRA

+0

welcome:) ..... – WPFUser