让用户选择要在WPF DataGrid上显示的列

Joh*_*hnB 3 c# wpf wpf-controls wpfdatagrid

DataGrid有一组默认的列显示,但我也想让用户选择/取消选择其应用程序上显示的列.在WPF中有相对简单的方法吗?

DataGrid是必然的DataTable.

注意:RadioButton如果上述功能过于复杂,我可以通过解决方案使用简单的"默认列/所有列" .

Dan*_*n J 6

简短的回答是,将Visibility每列的属性绑定到您能够设置的布尔标志(通过CheckBox或其他机制),并使用BooleanToVisibilityConverter使列可见性在未设置标志时折叠.

挖掘这个类似的问题,特别是这个答案!他的博客文章列出了我理想的解决方案.:)


H.B*_*.B. 6

将a 绑定DataGrid.Columns到包含可见性切换的a,除了以下内容之外无需代码:ItemsControlDataTemplateCheckBoxVisbilityToBoolConverter

<Window
    ...
    DataContext="{Binding RelativeSource={RelativeSource Mode=Self}}" Loaded="Window_Loaded">
    <Window.Resources>
        <local:VisibilityToBoolConverter x:Key="VisibilityToBoolConv"/>
    </Window.Resources>
    <StackPanel Orientation="Vertical">
        <DataGrid ItemsSource="{Binding Data}" Name="DGrid"/>
        <ItemsControl ItemsSource="{Binding ElementName=DGrid, Path=Columns}" Grid.IsSharedSizeScope="True" Margin="5">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition SharedSizeGroup="A"/>
                            <ColumnDefinition SharedSizeGroup="B"/>
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Header}" Margin="5"/>
                        <CheckBox Grid.Column="1"  IsChecked="{Binding Visibility, Converter={StaticResource VisibilityToBoolConv}}" Margin="5" HorizontalAlignment="Center" VerticalAlignment="Center"/>
                    </Grid>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </StackPanel>
</Window>
Run Code Online (Sandbox Code Playgroud)

注意:我有一个TextBlock假设Column-Header是一个字符串,如果不是这样的话可能需要调整.


VisibilityConverter:

[ValueConversion(typeof(Visibility), typeof(bool))]
public class VisibilityToBoolConverter : IValueConverter
{
    #region IValueConverter Members

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Visibility vis = (Visibility)value;
        switch (vis)
        {
            case Visibility.Collapsed:
                return false;
            case Visibility.Hidden:
                return false;
            case Visibility.Visible:
                return true;
        }
        return false;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
        System.Globalization.CultureInfo culture)
    {
        if ((bool)value) return Visibility.Visible;
        else return Visibility.Collapsed;
    }

    #endregion
}
Run Code Online (Sandbox Code Playgroud)

  • 努力+1,@ HB这是我在答案中写的很多代码.:) (2认同)
  • 我肯定会花太多时间在这...诅咒Stack-Overflow! (2认同)