0

我看到 DataTemplate 的方式是,您可以将它传递给显示“像这样显示我的东西”的控件。您可以在单个控件(例如 ContentControl)或某种列表控件(例如 ListBox)上使用模板。我一直认为缺少的是一种定义模板的方法,该模板告诉 DataGrid 之类的多列控件一种显示某些内容的方法。假设我想将员工列表传递给 DataGrid,并告诉它在第一列中显示员工 ID,在第二列中显示名称等。我可以为每一列传递一个模板,但这会有点混乱。我想定义一个模板来描述如何在多列控件中显示对象。

为了解决这个问题,我创建了自己的非常粗略的类,我称之为 DataGridTemplate 和 DataGridTemplateColumnTemplate。这很有效,我已经在我的应用程序的几个地方使用了它,但我相当肯定这不是最好的方法。它只是一个类,它不是从 DataTemplate 继承的,如果我需要在网格或网格的列上设置属性,那么我需要复制这些属性中的每一个。无论如何,我的问题是,有没有更好的方法来做到这一点?

[System.Windows.Markup.ContentProperty("Columns")]
public class DataGridTemplate
{        
    public List<DataGridTemplateColumnTemplate> Columns { get; set; }

    public Style Style { get; set; }

    public DataGridTemplate()
    {
        Columns = new List<DataGridTemplateColumnTemplate>();
    }

    public IEnumerable<DataGridTemplateColumn> CreateColumns()
    {
        return Columns.Select(c => c.CreateColumn());
    }

    public void ApplyToGrid(DataGrid grid)
    {
        if(Style != null) grid.Style = Style;
        grid.Columns.Clear();
        CreateColumns().AddAllTo(grid.Columns);
    }
}

public class DataGridTemplateColumnTemplate
{
    public object Header { get; set; }
    public DataTemplate CellTemplate { get; set; }
    public double MinWidth { get; set; }
    public double MaxWidth { get; set; }

    public DataGridTemplateColumnTemplate()
    {
        MinWidth = 20.0;
        MaxWidth = double.PositiveInfinity;
    }

    public DataGridTemplateColumn CreateColumn()
    {
        var col = new DataGridTemplateColumn();
        col.Header = Header;
        col.CellTemplate = CellTemplate;
        col.MinWidth = MinWidth;
        col.MaxWidth = MaxWidth;
        return col;
    }
}
4

0 回答 0