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