Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何绑定到DataGrid/DataTable中的具体对象_C#_Wpf_Datagrid_Datatable - Fatal编程技术网

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

C# 如何绑定到DataGrid/DataTable中的具体对象,c#,wpf,datagrid,datatable,C#,Wpf,Datagrid,Datatable,编辑:这些列只有在运行时才知道,这就是为什么我要动态地在DataTable中构造数据 我有一些动态数据,必须在数据网格中显示。datagrid中的每个单元格都将绑定到一个复杂的数据类型。我成功地构建了数据表并绑定到它上。DataGrid正确地自动生成其列,但所有数据都是字符串 在代码隐藏(用于临时调试)中,我正在处理AutoGeneratingColumn事件并尝试动态设置列类型。如果具有复杂类型: public class BoolData { public bool Value {

编辑:这些列只有在运行时才知道,这就是为什么我要动态地在DataTable中构造数据

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

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

public class BoolData 
{
    public bool Value { get; set; }
    public Guid Id{ get; set; }
}
在视图的代码隐藏中,我执行以下操作:

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()


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

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

您应该直接在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>

在不知道列名的情况下,您应该在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>

好的,我知道问题出在哪里了。如果我粘贴了创建DataTable的代码,可能会有人发现它


在创建DataTable(特别是DataColumns)时,必须显式设置数据类型,否则默认为string。一点也不明显,但最终还是成功了。

列只有在运行时才知道,这就是为什么我要动态地在DataTable中构造数据。列只有在运行时才知道,这就是为什么我要动态地在DataTable中构造数据。这就是我要做的,但在问题中,e.PropertyType始终等于typeof(string)。Datagrid或DataTable正在调用BoolData实例上的ToString并将其返回,因此实际的BoolData对象永远不会到达UI。是否确实正确填充了DataTable?当我尝试使用一个简单的示例时,OnAutogeneratingColumn方法正确地检索了数据类型。我缺少的一点是,当我添加DataColumns时,我没有显式地设置数据类型,因此它默认为String。