如何绑定到DataGrid / DataTable中的具体对象

时间:2013-12-02 12:16:05

标签: c# wpf datagrid datatable

编辑:这些列只在运行时才知道,这就是我为什么要在DataTable中动态构建数据的原因。

我有一些动态数据,我必须在DataGrid中显示。数据网格中的每个单元格都将绑定到复杂的数据类型。我成功构建了DataTable并绑定到它上面。 DataGrid正确地自动生成其列,但所有数据都是字符串。

在后面的代码中(用于临时调试)我正在处理AutoGeneratingColumn事件并尝试动态设置列类型。如果有复杂的类型:

public class BoolData 
{
    public bool Value { get; set; }
    public Guid Id{ get; set; }
}

在View背后的代码中,我这样做:

private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyType == typeof(string))
    {
        var col = new DataGridTextColumn {Binding = new Binding(e.PropertyName)};
        e.Column = col;
        e.Column.Header = e.PropertyName;
    }
    else if (e.PropertyType == typeof(BoolData))
    {
        var col = new DataGridCheckBoxColumn {Binding = new Binding(e.PropertyName + "." + "Value")};
        e.Column = col;
        e.Column.Header = e.PropertyName;
    }
}

问题在于,即使我将MyBool对象添加到DataTable中,字符串“MyNamespace.MBoolData”也是DataGrid中的内容,这意味着第一个“if”子句是唯一使用的子句。就像DataGrid或DataTable在尝试显示对象之前调用对象上的ToString()一样。

所以我想我的问题是 - 如何创建一个包含复杂对象的动态DataTable,然后绑定到它。

4 个答案:

答案 0 :(得分:0)

您只需在XAML中定义列并使用DataGridTemplateColumn来定义复杂对象的外观。链接页面上有一个完整的代码示例,但这是基础知识...您定义了一个DataTemplate来准确描述复杂对象在UI中的外观,然后您可以将其设置为DataGridTemplateColumn.CellTemplate属性。

答案 1 :(得分:0)

您应该直接在XAML中尝试此操作。

<DataGrid ItemsSource="{Binding YourDataSource}" AutoGenerateColumns="False" >
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="TheHeaderNameOfYourColumn" Width="SizeToCells">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <CheckBox IsChecked="{Binding Value}"/>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

答案 2 :(得分:0)

在不知道列名的情况下,您应该在DataGrid资源中创建一个模板

<DataGrid>
    <DataGrid.Resources>
        <DataTemplate DataType="{x:Type my:BoolData}"> <!--where "my" points to the correct namespace-->
            <CheckBox IsChecked="{Binding Value}"/>
        </DataTemplate>
    </DataGrid.Resources>
</DataGrid>

答案 3 :(得分:0)

好的,我弄清楚问题是什么。如果我已经粘贴了用于创建DataTable的代码,那么很可能会发现它。

当您创建DataTable,特别是DataColumns时,必须显式设置DataType,否则默认为string。一点也不明显,但终于让它发挥作用了。