我可以通过AutoGeneratedColumns设置DataGridHeader吗?

时间:2019-06-04 02:25:08

标签: c# wpf datagrid

我想通过AutoGeneratedColumns设置标头FirstName,LastName。 我尝试了这段代码,但是DataGrid Header显示了Name1,Name2。

我知道,DataGridColumns可以创建标题。 但是我想通过AutoGeneratedColumns设置标题。

有什么办法吗?

感谢您抽出宝贵的时间对此进行评论!

ViewModel

public class DataGridItems
{
    [Description("FirstName")]
    public string Name1 { get; set; }

    [Description("LastName")]
    public string Name2 { get; set; }
}

MainWindow

public partial class MainWindow : Window
{
    public List<DataGridItems> ItemsSource { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = Enumerable.Range(1, 10).Select(a => new DataGridItems { Name1 = a.ToString(), Name2 = "Last" + a.ToString() });
    }
}

XAML

<Grid>
    <DataGrid ItemsSource="{Binding}"/>
</Grid>

1 个答案:

答案 0 :(得分:1)

您可以在视图中处理AutoGeneratingColumn事件:

public partial class MainWindow : Window
{
    public List<DataGridItems> ItemsSource { get; set; }

    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = Enumerable.Range(1, 10).Select(a => new DataGridItems { Name1 = a.ToString(), Name2 = "Last" + a.ToString() });
    }


    private void DataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
    {
        DescriptionAttribute descriptionAttribute = typeof(DataGridItems)
            .GetProperty(e.PropertyName)?
            .GetCustomAttributes(true)?
            .OfType<DescriptionAttribute>()
            .FirstOrDefault();
        if (descriptionAttribute != null)
            e.Column.Header = descriptionAttribute.Description;
    }
}

XAML:

<DataGrid ItemsSource="{Binding}" AutoGeneratingColumn="DataGrid_AutoGeneratingColumn"/>

提供在视图中设置DataGrid的标头的功能不是视图模型的责任。这应该在视图或控件中实现,就像在XAML标记中将标头设置为某些固定值时一样。