首页 > 解决方案 > 在 Data Grid 的最后一个 Data Column 上放置一个上下文菜单来控制 WPF 中其他列的可见性

问题描述

如何在 DataGrid 的最后一个数据列上放置上下文菜单,以便它可以控制其他列的可见性。

我有一个共有 8 列的数据网格。如何在最后一列放置上下文菜单?需要了解是否有可能从上下文菜单中控制其他列的可见性(如下图所示)?

<DataGrid  x:Name="MyGrid" ItemsSource="{Binding obvCollection}" AutoGenerateColumns="False" > 
        <DataGridTemplateColumn Header = "Column 1"/>
        <DataGridTemplateColumn Header = "Column 2"/>
        <DataGridTemplateColumn Header = "Column 3"/>
        <DataGridTemplateColumn Header = "Column 4"/>
        <DataGridTemplateColumn Header = "Column 5"/>
        <DataGridTemplateColumn Header = "Column 6"/>
        <DataGridTemplateColumn Header = "Column 7"/>
        <DataGridTemplateColumn Header = "Column 8"/>
        <DataGridTemplateColumn Header = ""/>
    </Datagrid>     

标签: c#wpfwpf-controlscontextmenuwpfdatagrid

解决方案


您可以使用转换器实现此目的:

class VisibilityToBooleanConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Visibility visibility = (Visibility)value;
        return visibility == Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool b = (bool)value;
        return b ? Visibility.Visible : Visibility.Hidden;
    }
}

...和一些 XAML 标记:

<DataGridTemplateColumn>
    <DataGridTemplateColumn.Header>
        <Grid Background="Gray" Width="25" Height="25"
              Tag="{Binding Columns, ElementName=MyGrid}">
            <Grid.ContextMenu>
                <ContextMenu ItemsSource="{Binding PlacementTarget.Tag, RelativeSource={RelativeSource Self}}">
                    <ContextMenu.ItemTemplate>
                        <DataTemplate>
                            <CheckBox x:Name="chk">
                                <CheckBox.IsChecked>
                                    <Binding Path="Visibility">
                                        <Binding.Converter>
                                            <local:VisibilityToBooleanConverter />
                                        </Binding.Converter>
                                    </Binding>
                                </CheckBox.IsChecked>
                                <CheckBox.Content>
                                    <TextBlock Text="{Binding Header}" />
                                </CheckBox.Content>
                            </CheckBox>
                            <DataTemplate.Triggers>
                                <!-- hide the last column in the ContentMenu-->
                                <DataTrigger Binding="{Binding DisplayIndex}" Value="5">
                                    <Setter TargetName="chk" Property="Visibility" Value="Collapsed" />
                                </DataTrigger>
                            </DataTemplate.Triggers>
                        </DataTemplate>
                    </ContextMenu.ItemTemplate>
                </ContextMenu>
            </Grid.ContextMenu>
        </Grid>
    </DataGridTemplateColumn.Header>
</DataGridTemplateColumn>

Grid示例标记中的 替换为汉堡包按钮或您希望用户单击以调出ContextMenu.


推荐阅读