5

質問:

XAML でa を定義し、DataTemplate(シングルトンを取得するのではなく) コードでインスタンス化し、 aが必要な場所に送信する前にそれをFindResource変更する方法はありますか?VisualTreeDataTemplateDataGridTemplateColumn.CellTemplate

バックグラウンド:

私は独自に列を追加data[][]して 2 次元配列を表示していますが、配列内の各要素を表示する方法を知っている XAML で定義されています。ただし、各セルのデフォルトは行です。そのため、ルート ビジュアル要素をバインディングに設定して列インデックスを「パラメータ化」する必要があります。現在、is は in として定義され、毎回同じインスタンスを返すby によって取得されます。呼び出すだけでなく、ツリー自体をロードするのではなく、ツリーを取得できます。コード内をインスタンス化し、必要な変更を行い、に設定する方法を探していますDataGridDataGridTemplateColumnDataTemplateDataContextdata[x]DataTemplateDataContext"[y]"yDataTemplateDataGrid.ResourcesFindResource()LoadContent()UIElementVisualTreeDataTemplateDataTemplateDataGridTemplateColumn.CellTemplate.

4

3 に答える 3

9

Sisypheの答えに触発されて、私はこのよりポータブルなソリューションを見つけました:

public class DataGridBoundTemplateColumn : DataGridTemplateColumn
{
    public string BindingPath { get; set; }

    protected override FrameworkElement GenerateEditingElement(DataGridCell cell, object dataItem)
    {
        var element = base.GenerateEditingElement(cell, dataItem);
        element.SetBinding(ContentPresenter.ContentProperty, new Binding(this.BindingPath));
        return element;
    }

    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        var element = base.GenerateElement(cell, dataItem);
        element.SetBinding(ContentPresenter.ContentProperty, new Binding(this.BindingPath));
        return element;
    }
}

使用法:

var cellTemplate = (DataTemplate)this.dataGrid.FindResource("cellTemplate");
foreach (var c in data.Columns)
{
    var col = new DataGridBoundTemplateColumn
    {
        Header = c.HeaderText,
        CellTemplate = cellTemplate,
        BindingPath = string.Format("[{0}]", c.Index)
    };

    this.dataGrid.Columns.Add(col);
}

これが私の質問と同じ要件を持つ人に役立つことを願っています。

于 2012-12-28T21:44:02.160 に答える
1
(templateKey as DataTemplate).LoadContent()

説明: を呼び出すLoadContentと、 内のUIElementオブジェクトDataTemplateが作成され、それらを別の のビジュアル ツリーに追加できますUIElement

于 2012-12-22T07:27:16.727 に答える