编辑:这些列只在运行时才知道,这就是我为什么要在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,然后绑定到它。
答案 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。一点也不明显,但终于让它发挥作用了。