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

时间:2018-08-04 22:52:28

标签: c# wpf datagrid syncfusion celltemplate

我的应用程序在运行时构建数据表(行和列),因此列/属性是可变的。 现在,我将其显示在数据网格中,并尝试设置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);
            }
        }
    }

还有一个单元格样式。我一直无法获取每个数据表单元格的值。因此,例如,在这里,我只是采用原始的数据表单元格值并将其绑定/显示在每个datagrid文本块中。

    <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中构建它,所以我真正需要的是将column参数传递给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;
    }

2 个答案:

答案 0 :(得分:0)

  

所以我真正需要的是将column参数传递给XAML

恐怕没有“ XAML解决方案”绑定到在构建时名称未知的属性。毕竟XAML是一种标记语言。

因此,您将必须像在DataTemplate方法中当前所做的那样,以编程方式和动态方式为每列创建一个GetDataTemplate。您无法在XAML中执行类似Text="{Binding [DynamicValue]}"的操作。

答案 1 :(得分:0)

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

注意:我为Syncfusion工作。