在IValueConverter类中为DataGrid绑定创建DataTable

时间:2011-06-26 08:59:52

标签: wpf datagrid datatable

我需要创建一个绑定到类似于以下对象的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保持为空的任何想法?

1 个答案:

答案 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;
}