WPF DataGrid 绑定(bind)到数据表

标签 wpf data-binding datagrid datatemplateselector

这让我发疯了。我在代码中创建一个 DataGrid,然后将它绑定(bind)到一个数据表。这是动态的,每次创建网格时行和列都会不同。

基本上我遍历我的数据表并为每一列创建 DataGrid 列,如下所示:

private static void CreateDataGridColumns(DataGrid datagrid, Document doc)
{
    if (doc == null) return; //return 

    datagrid.Columns.Clear();
    foreach (var item in doc.Keys)
    {
        var column = new DataGridTemplateColumn
        {
           Header = item,
           CellTemplateSelector = new CustomRowDataTemplateSelector(),
         };

        datagrid.Columns.Add(column);
    }
}

如您所见,我正在使用自定义数据模板选择器,因此我可以根据单元格的内容以不同的方式呈现单元格。

这是模板选择器
public class CustomRowDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate
        SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        var presenter = container as ContentPresenter;
        var gridCell = presenter.Parent as DataGridCell;

        if (element != null && item != null && gridCell != null)
        {
            var row = item as DataRow;

            if (row != null)
            {
                var cellObject = row[gridCell.Column.DisplayIndex];

                //set template based on cell type

                if (cellObject is DateTime)
                {
                    return element.FindResource("dateCell") as DataTemplate;
                }

                return element.FindResource("stringCell") as DataTemplate;
            }


        }

        return null;
    }
}

这是我的 stringCell 数据模板
<DataTemplate x:Key="stringCell">
    <StackPanel>
        <TextBlock Style="{StaticResource cellStyle}" 
                    Grid.Row="0" Grid.Column="0" 
                    Text="{Binding Converter={StaticResource cellConverter}}" />
    </StackPanel>
</DataTemplate>

问题是每个单元格都调用了模板选择器(如预期的那样),但我不知道它是哪个单元格,所以我不知道如何在 TextBlock 上设置文本。我很想做这样的事情
<DataTemplate x:Key="stringCell">
    <StackPanel>
        <TextBlock Style="{StaticResource cellStyle}" 
                    Grid.Row="0" Grid.Column="0" 
                    Text="{Binding Path=Row[CellIndex], Converter={StaticResource cellConverter}}" />
    </StackPanel>
</DataTemplate>

但是我无法获得 CellIndex。我该如何做与此类似的事情,我可以设置 Path=Row[CellIndex]

最佳答案

您可以尝试在代码中创建绑定(bind)。像这样的东西应该工作

var bind = new Binding(gridCell.Column.Header.ToString())
bind.Mode = BindingMode.TwoWay;
bind.Source = row;
BindingOperations.SetBinding(YourTextBlock, TextBlock.TextProperty, bind);

关于WPF DataGrid 绑定(bind)到数据表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3376057/

相关文章:

wpf - 在双向绑定(bind)中将 IValueConverter 与当前 DataContext 一起使用

wpf - 如何告诉我的 DataTemplate 绑定(bind)到 PARENT ViewModel 中的属性?

WPF MvvM DataGrid 动态列

wpf - 以编程方式将 Datagrid 列置于 View 中(水平滚动)

.net - 如何在 WPF MVVM 中使用用户控件

c# - 绑定(bind)到 Nullable<DateTime> 控件属性

.Net 在运行时重新排序 DataGridView 列

wpf - 数组按数据网格上的位置绑定(bind) Xaml

c# - Canvas 上的 ScaleTransform 调整大小以比 child 更高的速度缩小 Canvas

data-binding - core-list-dart 模板如何绑定(bind)到模型本身