WPF数据表格绑定到数据表

6

这真是让我抓狂。我正在通过代码创建一个DataGrid,然后将其绑定到数据表。这是动态的,每次创建网格时行和列都会不同。

基本上,我遍历我的数据表,并为每一列创建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,该怎么做才能实现类似的功能,即设置路径=行[CellIndex]?

2个回答

0
你可以尝试在代码中创建绑定。像这样的代码应该可以工作。
var bind = new Binding(gridCell.Column.Header.ToString())
bind.Mode = BindingMode.TwoWay;
bind.Source = row;
BindingOperations.SetBinding(YourTextBlock, TextBlock.TextProperty, bind);

-1

不确定您在功能上想要实现什么。您可以尝试在代码中完成它。创建一个更高级别的类CellClass,它具有属性DisplayValue,并实现日期和字符串。使用Path = DisplayValue将源绑定到CellClass。您甚至可以创建List CellClasses并绑定到CellClass [0],CellClass [1]等。我知道这可以工作,因为我这样做了,但我不确定它是否提供了您要寻找的功能。

    public abstract class CellClass
    {
         public abstract String DispValue { get; }
    }
    public class CellClassDate : CellClass
    {
         public override String DispValue { get ...; }
         public DateTime DateValue { get .. set ... }
    }
    public class CellClassString : CellClass
    {
         public override String DispValue { get ...; }
         public DateTime StringValue { get .. set ... }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接