在WPF中使用数据注释隐藏列

joe*_*975 5 wpf data-annotations

我在WPF中有一个网格,自动生成列.如何使用数据注释动态隐藏列?

我想在我的模型中有一个属性来指定列是否可见,但我不知道该怎么做.

我的模型,绑定到网格:

public class Template
{
        public string County { get; set; }

        public string Operator { get; set; }

        public string Field { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

Ana*_*ali 6

这是一个使用属性来隐藏列的示例。它使用附加属性来处理AutoGeneratingColumn事件。

HideColumnIfAutoGenerated.cs - 属性

namespace AutoHideColumn
{
    public class HideColumnIfAutoGenerated : System.Attribute
    {
        public HideColumnIfAutoGenerated()
        {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

DataGridExtension.cs - 附加属性

using System.ComponentModel;
using System.Windows;
using System.Windows.Controls;

namespace AutoHideColumn
{
    public static class DataGridExtension
    {
        public static readonly DependencyProperty HideAnnotatedColumnsProperty = DependencyProperty.RegisterAttached(
           "HideAnnotatedColumns",
           typeof(bool),
           typeof(DataGridExtension),
           new UIPropertyMetadata(false, OnHideAnnotatedColumns));

        public static bool GetHideAnnotatedColumns(DependencyObject d)
        {
            return (bool)d.GetValue(HideAnnotatedColumnsProperty);
        }

        public static void SetHideAnnotatedColumns(DependencyObject d, bool value)
        {
            d.SetValue(HideAnnotatedColumnsProperty, value);
        }

        private static void OnHideAnnotatedColumns(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            bool hideAnnotatedColumns = (bool)e.NewValue;

            DataGrid dataGrid = d as DataGrid;

            if (hideAnnotatedColumns)
            {
                dataGrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn;
            }
            else
            {
                dataGrid.AutoGeneratingColumn -= dataGrid_AutoGeneratingColumn;
            }
        }

        private static void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
        {
            PropertyDescriptor propertyDescriptor = e.PropertyDescriptor as PropertyDescriptor;
            if (propertyDescriptor != null)
            {
                foreach (var item in propertyDescriptor.Attributes)
                {
                    if (item.GetType() == typeof(HideColumnIfAutoGenerated))
                    {
                        e.Cancel = true;
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

XAML

<Window x:Class="AutoHideColumn.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:AutoHideColumn"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="*"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>
            <DataGrid Name="dg" local:DataGridExtension.HideAnnotatedColumns="True">

        </DataGrid>
        <DataGrid Grid.Row="1" Name="dg1">

        </DataGrid>
    </Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)

代码隐藏

using System.Collections.Generic;
using System.Windows;

namespace AutoHideColumn
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            this.dg.ItemsSource = new List<Customer>();
            this.dg1.ItemsSource = new List<Customer>();
        }
    }

    public class Customer
    {
        [HideColumnIfAutoGenerated()]
        public int ID { get; set; }

        public string Name { get; set; }
    }
}
Run Code Online (Sandbox Code Playgroud)


yo *_*han 2

尝试这个

public partial class MainWindow : Window
{
    private List<string> visibleColumns;
    public MainWindow()
    {
        InitializeComponent();
        InitializeList();
        visibleColumns = GetVisibleColumns();
        dg.AutoGeneratingColumn += dg_AutoGeneratingColumn;
        dg.ItemsSource = Templates;
    }

    void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        if(!visibleColumns.Contains(e.Column.Header.ToString()))
            e.Column.Visibility=Visibility.Collapsed;

    }

    List<string> GetVisibleColumns()
    {
        return typeof(Template).GetProperties()
              .Where(p =>
               p.GetCustomAttributes(typeof(Visible), true)
               .Where(ca => ((Visible)ca).IsVisible).Any()
      ).Select(s => s.Name).ToList();
    }

    private void InitializeList()
    {
        Templates = new List<Template>();
        Templates.Add(new Template { County = "abc", Operator = "123", Field = "xyz" });
        Templates.Add(new Template { County = "abc", Operator = "123", Field = "xyz" });
        Templates.Add(new Template { County = "abc", Operator = "123", Field = "xyz" });
        Templates.Add(new Template { County = "abc", Operator = "123", Field = "xyz" });
    }

    public List<Template> Templates { get; set; }


}
Run Code Online (Sandbox Code Playgroud)

>模板类

public class Template
{
    [Visible(false)]
    public string County { get; set; }

    [Visible(true)]
    public string Operator { get; set; }

    [Visible(true)]
    public string Field { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

>可见属性

public class Visible : Attribute
{
    public Visible(bool isVisible)
    {
        IsVisible = isVisible;
    }
    public bool IsVisible { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

>xaml

<Grid>
    <DataGrid AutoGenerateColumns="True" x:Name="dg"/>
</Grid>
Run Code Online (Sandbox Code Playgroud)