为代码中创建的DataGridTemplateColumn添加数据绑定[英] Add data-binding for DataGridTemplateColumn created in code

本文是小编为大家收集整理的关于为代码中创建的DataGridTemplateColumn添加数据绑定的处理方法,想解了为代码中创建的DataGridTemplateColumn添加数据绑定的问题怎么解决?为代码中创建的DataGridTemplateColumn添加数据绑定问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

问题:

有没有办法在 XAML 中定义一个 DataTemplate 并在代码中实例化它(而不是通过 FindResource 检索单例)并在发送到需要 DataTemplate 的位置之前修改它的 VisualTree,例如 DataGridTemplateColumn.CellTemplate?

背景:

我通过自己添加 DataGridTemplateColumn 列在 DataGrid 中显示二维数组 data[][],并且在 XAML 中定义了一个知道如何呈现数组中每个元素的 DataTemplate.但是,每个单元格的默认 DataContext 是行,即 data[x].因此,我需要通过将根可视元素的 DataContext 设置为绑定 "[y]" 来为每一列"参数化"DataTemplate,其中 y 是列索引.目前 DataTemplate 在 DataGrid.Resources 中定义并由 FindResource() 检索,每次都返回相同的实例.除了调用 LoadContent() 给了我 UIElement 树,而不是在 DataTemplate 本身上加载 VisualTree .我正在寻找一种方法来实例化代码中的 DataTemplate,进行所需的修改并设置为 DataGridTemplateColumn.CellTemplate.

推荐答案

受 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);
}

希望这对与我的问题有相同要求的人有所帮助.

本文地址:https://www.itbaoku.cn/post/1794108.html