【问题标题】:How to get Data Grid column index on right click? MVVM WPF如何在右键单击时获取数据网格列索引? MVVM WPF
【发布时间】:2017-01-11 08:40:44
【问题描述】:

我想获得column Index 并通过CommandParameter 传递它,我在context menu 中为Data grid column header

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

【问题讨论】:

  • 你的数据网格和列也绑定了什么?

标签: c# wpf mvvm datagrid datagridcolumnheader


【解决方案1】:

这可能是因为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

【讨论】:

    猜你喜欢
    • 2012-01-08
    • 1970-01-01
    • 2018-07-14
    • 2014-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多