Создание DataTable внутри класса IValueConverter для привязки DataGrid - PullRequest
0 голосов
/ 26 июня 2011

Мне нужно создать 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 голосов
/ 26 июня 2011

Конечно, пусто, вы создаете 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...