DataTemplating для привязки данных вложенных ObservableCollections - PullRequest
1 голос
/ 29 марта 2012

Я пытаюсь создать элемент управления ListView, который заполняется через привязку к коллекции ObservableCollection, которая сама содержит другую коллекцию ObservableCollection, из которой мне нужно отобразить данные в ListView.

Чтобы уточнить, у меня есть иерархия объектовследующим образом:

ClassA
{
    int ID = 123;
    string Name = "Value";
}

ClassB
{
    int ID = 456;
    ObservableCollection<ClassA> CollectionOfClassA;
}

ClassC
{
    int ID = 789;
    ObservableCollection<ClassB> CollectionOfClassB;
}

Исходя из этого, я хотел бы получить следующую компоновку ListView:

(ClassC.CollectionOfClassB ListView)
+-------------+-------------+------------------+--------------------------------+
|  ClassB.ID  |  CollectionOfClassA.ClassA.ID  |  CollectionOfClassA.ClassA.ID  |
+-------------+-------------+------------------+--------------------------------+
|  ClassB.ID  |  CollectionOfClassA.ClassA.ID  |  CollectionOfClassA.ClassA.ID  |
+-------------+-------------+------------------+--------------------------------+

Для достижения этой цели я бы предположил, что мне нужно привязать свой ListView к моему CollectionOfClassBОднако сбор данных, структура таблицы данных и последующее связывание для создания строк меня немного озадачили.

Может ли кто-нибудь помочь мне с этим, пожалуйста?

Большое спасибо,

Редактировать:

Первый столбец в таблице выше ссылается на поле идентификатора для индексированного объекта в коллекции ClassC.CollectionOfClassB, каждая строка представляет собой отдельный объект, хранящийся в CollectionOfClassB.

Каждый из объектов ClassB, хранящихся в CollectionOfClassB, имеет свой собственный CollectionOfClassA, тогда какЯ пытаюсь поместить в список в той же строке, что и его родитель.Каждый объект ClassA в CollectionOfClassA является столбцом.

Edit 2:

Первый столбец заполняется полем ID из ClassB для текущего элемента в CollectionOfClassB,последующие столбцы заполняются данными из каждого элемента в CollectionOfClassA.Заголовок столбца будет ClassA.ID, в то время как содержимое будет, например, ClassA.Name.

Я ищу пример разметки XAML, которая позволит мне добиться этого.

1 Ответ

1 голос
/ 29 марта 2012

Если вы знаете, что ClassB.CollectionOfClassA всегда одинаковой длины, вы можете связать его с индексированным значением

Вот грубый пример

<!-- Assumes DataContext is ClassC -->
<ListView ItemsSource="{Binding CollectionOfClassB}">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Id}" Header="ClassB.Id" />
            <GridViewColumn DisplayMemberBinding="{Binding CollectionOfClassA[0].Id}" Header="ClassA[0].Id" />
            <GridViewColumn DisplayMemberBinding="{Binding CollectionOfClassA[1].Id}" Header="ClassA[1].Id" />
        </GridView>
    </ListView.View>
</ListView>

Если у вас динамическое количество столбцов, оно становится немного сложнее

Самый простой способ - использовать пользовательский столбец и отображать элементы в виде горизонтали StackPanel

<!-- Assumes DataContext is ClassC -->
<ListView ItemsSource="{Binding CollectionOfClassB}">
    <ListView.View>
        <GridView>
            <GridViewColumn DisplayMemberBinding="{Binding Id}" Header="ClassB.Id" />
            <GridViewColumn Header="CollectionOfA"
                <GridViewColumn.CellTemplate>
                    <DataTemplate>
                        <ItemsControl ItemsSource="{Binding CollectionOfClassA}">
                            <ItemsControl.ItemsPanelTemplate>
                                <StackPanel Orientation="Horizontal" />
                            </ItemsControl.ItemsPanelTemplate>

                            <ItemsControl.ItemTemplate>
                                <TextBlock Text="{Binding Id}" Width="50" />
                            </ItemsControl.ItemTemplate>
                        </ItemsControl>
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
        </GridView>
    </ListView.View>
</ListView>

Конечно, здесь не используются встроенные функции GridView, такие как сортировка

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...