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