我需要创建一个绑定到类似于以下对象的DataGrid:
public class MyClass
{
public string Header { get; set; }
public string[] Values { get; set; }
}
正如您所看到的,表所需的标题不是对象的属性名称,因此我不能仅仅使用AutoGenerateColumns。到目前为止,我的想法是使用转换器来获取MyClass对象并将它们转换为DataTable。
public object Convert(
object value,
Type targetType,
object parameter,
System.Globalization.CultureInfo culture)
{
var items = value as IEnumerable<MyClass>;
if (items != null)
{
DataTable dTable = new DataTable();
foreach (MyClass item in items)
dTable.Columns.Add(new DataColumn(item.Header, typeof(string)));
return dTable;
}
else
return null;
}
我将包含网格的DataContext设置为List<MyClass>
对象,并且命中了Convert()方法,并且通过外观看起来可以创建DataTable,但是当我来运行应用程序时, DataGrid只是空白。这是我的XAML的基本视图:
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:DataTableConverter x:Key="converter"/>
</Window.Resources>
<Grid x:Name="grid">
<DataGrid AutoGenerateColumns="True"
ItemsSource="{Binding Path=., Converter={StaticResource converter}}"/>
</Grid>
</Window>
DataGrid保持为空的任何想法?
答案 0 :(得分:0)
当然它是空白的,你创建的DataTable
没有任何行。
如果我理解你的(略微奇怪的)设计,每个MyClass
代表一列及其所有值。要显示该内容,您必须使用您班级中的值填充DataTable
的行:
public object Convert(
object value, Type targetType, object parameter, CultureInfo culture)
{
var items = value as IEnumerable<MyClass>;
if (items != null)
{
var array = items.ToArray();
var dTable = new DataTable();
foreach (MyClass item in array)
dTable.Columns.Add(new DataColumn(item.Header, typeof(string)));
if (array.Length > 0)
for (int i = 0; i < array[0].Values.Length; i++)
dTable.Rows.Add(array.Select(mc => mc.Values[i]).ToArray());
return dTable;
}
return null;
}