gpt4 book ai didi

wpf - 为代码中创建的 DataGridTemplateColumn 添加数据绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 05:59:10 24 4
gpt4 key购买 nike

问题:

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

背景:

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

最佳答案

受西西弗回答的启发,我找到了这个更便携的解决方案:

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

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

关于wpf - 为代码中创建的 DataGridTemplateColumn 添加数据绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14000873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com