DataTemplate用于DataGrid

时间:2012-09-12 05:50:31

标签: c# wpf datatemplate

我看到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;
    }
}

0 个答案:

没有答案