将 CellTemplate 应用于绑定到动态 DataTable 的 DataGrid

Apply CellTemplate to DataGrid bound to dynamic DataTable

我的应用程序在运行时构建了一个数据表(行和列),因此 columns/properties 是可变的。 现在我在数据网格中显示它并尝试设置 CellTemplate 并未能成功绑定每个单元格值。它在应用 CellTemplates 之前正确显示值...

这是我使用指定单元格样式构建数据网格的代码:

 private void BuildDataGridColumnsFromDataTable(DataTable dT)
    {
        foreach (DataColumn dTColumn in dT.Columns) 
        {
            var binding = new System.Windows.Data.Binding(dTColumn.ToString());

            DataTemplate dt = null;
            if (dTColumn.ColumnName == "Country")
            {
                GridTextColumn textColumn = new GridTextColumn();
                textColumn.MappingName = "Country";
                textColumn.Width = 100;

                MatrixDataGrid.Columns.Add(textColumn);
            }
            else
            {
                dt = (DataTemplate)Resources["NameTemplate"];
                GridTextColumn textColumn = new GridTextColumn();
                textColumn.MappingName = dTColumn.ColumnName;
                textColumn.CellTemplate = dt;

                MatrixDataGrid.Columns.Add(textColumn);
            }
        }
    }

还有一个单元格样式。我无法检索每个数据表单元格值。因此,例如,在这里我只采用原始数据表单元格值 & bind/display 它们在每个数据网格文本块中。

    <DataTemplate x:Key="NameTemplate">
        <TextBlock Name="NameTextBlock" DataContext="{Binding RelativeSource={RelativeSource AncestorType=DataGridCell}, Converter={StaticResource drvc}}" 
                   Text="{Binding}" Background="LightGreen"/>
    </DataTemplate>

----编辑---

我可以通过在代码隐藏中构建数据模板并像这样传递运行时创建的列(属性)来实现它:

textColumn.CellTemplate = GetDataTemplate(dTColumn.ColumnName);

虽然我更喜欢在 XAML 中构建它...所以我真正需要的是将列参数传递给 XAML。非常感谢任何关于如何最好地实现这一目标的想法!

        private static DataTemplate GetDataTemplate(string col) 
    {
        DataTemplate template = new DataTemplate();
        FrameworkElementFactory txtBox = new FrameworkElementFactory(typeof(TextBox));
        txtBox.SetValue(TextBox.TextAlignmentProperty, TextAlignment.Center);
        txtBox.SetValue(TextBox.BackgroundProperty, (Brush)(new BrushConverter()).ConvertFromString("#9EB11C"));
        template.VisualTree = txtBox;

        System.Windows.Data.Binding bind = new System.Windows.Data.Binding
        {
            Path = new PropertyPath(col), //Provides the column (property) at runtime.
            Mode = BindingMode.TwoWay
        };

        // Third: set the binding in the text box
        txtBox.SetBinding(TextBox.TextProperty, bind);

        return template;
    }

so what I'm really needing is to pass the column parameter to XAML

恐怕没有 "XAML solution" 可以绑定到 属性,其名称在构建时未知。毕竟 XAML 是一种标记语言。

因此,您必须以编程方式和动态方式为每列创建一个 DataTemplate,就像您目前在 GetDataTemplate 方法中所做的那样。您不能在 XAML.

中执行类似 Text="{Binding [DynamicValue]}" 的操作

您可以参考此 forum 在后台代码中创建 DataTemplate 期间将基础数据对象动态绑定到控件的 属性。

注意:我为 Syncfusion 工作。