Инфраструктура XamDataGrid с переменным количеством столбцов - PullRequest
3 голосов
/ 26 апреля 2011

Мне нужно иметь возможность поддерживать XamDataGrid, который во время разработки не будет иметь установленного количества столбцов. Например, приложение запустится, получит некоторые данные с сервера и создаст несколько объектов. В зависимости от ответа от сервера у меня может быть разное количество объектов при каждом запуске приложения.

Вот пример того, что я имею в виду. Допустим, я звоню в какой-то сервис и получаю ответ xml с некоторой информацией. Я десериализую этот ответ на несколько объектов, которые могут отличаться при каждом вызове.

Допустим, каждый объект имеет два свойства: Метка и Значение. Мне бы хотелось, чтобы в сетке отображались столбцы с метками, которые соответствуют значению метки со значениями из значения. Итак, если у меня есть два объекта, obj1 и obj2, которые выглядят так:

obj1.Label = "Parts"
obj1.Value = "17"

obj2.Label = "Parts"
obj2.Value = "12"

Мне бы хотелось, чтобы сетка была похожа на это и состояла из двух строк:

части

17

12

Если я связываю свой источник данных с сеткой, сетка автоматически использует свойства объекта для создания столбцов, поэтому я вижу столбцы Метка и Значение:

Значение метки

запчасти 17

Запчасти 12

Я предполагаю, что не могу достичь того, чего хочу, только через xaml. У кого-нибудь есть пример того, что я ищу? Это только мне, чтобы создать все столбцы во время выполнения программно?

Ответы [ 3 ]

1 голос
/ 26 апреля 2011
 <Grid>
    <DataGrid Name="dgTest" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn>
                <DataGridTemplateColumn.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}, Path=ItemsSource[0].Label}" />
                        </StackPanel>
                    </DataTemplate>
                </DataGridTemplateColumn.HeaderTemplate>
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding Path=Value}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

и код:

public partial class Window12 : Window
{
    public Window12()
    {
        InitializeComponent();

        List<MyClass> l = new List<MyClass>();

        l.Add(new MyClass
        {
            Label = "Parts",
            Value = "17"
        });

        l.Add(new MyClass
        {
            Label = "Parts",
            Value = "12"
        });

        dgTest.ItemsSource = l;
    }
}

public class MyClass
{
    public string Label { get; set; }
    public string Value { get; set; }
}
0 голосов
/ 22 января 2016

Я ответил на такой вопрос в другом посте

Добавление переменной № столбцов

В котором я создал поведение и добавил столбцы в зависимости от какого-либо условия (в моем случае расположение полей отсутствует). Вы можете проверить источник данных, а затем сделать то же самое.

И вам нужно где-то определить несколько наборов столбцов, а затем извлечь их, чтобы создать FieldLayout для вашей XamDataGrid на основе источника данных.ex.

        XamDataGrid xamDataGrid;
        if (DataSource.GetType() == typeof(X))
        {
            AddFieldLayout1(xamDataGrid);
        }
        else if (DataSource.GetType() == typeof(Y))
        {
            AddFieldLayout2(xamDataGrid);
        }

А в AddFieldLayout метод добавляет поля в макет сетки.

0 голосов
/ 09 мая 2011

Решение Иверзина будет работать с XamDataGrid.Он имеет возможность автоматически генерировать поля , поэтому вам не нужно указывать их во время разработки.

...