0

私がDataTemplateを見る方法は、「私のものをそのように表示する」というコントロールに渡すことができるものであるということです。テンプレートは、単一のコントロール(ContentControlなど)またはある種のリストコントロール(ListBoxなど)で使用できます。私がいつも欠けていたと思っていたのは、DataGridなどの複数列のコントロールに何かを表示する方法を指示するテンプレートを定義する方法でした。スタッフのリストをDataGridに渡し、最初の列にスタッフID、2番目の列に名前などを表示するように指示するとします。各列にテンプレートを渡すことはできますが、少し面倒になります。複数列のコントロールでオブジェクトを表示する方法を説明する単一のテンプレートを定義したいと思います。

この問題を解決するために、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