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