Wpf 用于嵌套ObservableCollections数据绑定的数据模板

Wpf 用于嵌套ObservableCollections数据绑定的数据模板,wpf,listview,data-binding,Wpf,Listview,Data Binding,我正在尝试创建一个ListView控件,该控件通过绑定到ObservableCollection来填充,ObservableCollection本身包含另一个ObservableCollection,我需要从中在ListView中显示数据 为了澄清,我有一个对象层次结构,如下所示: ClassA { int ID = 123; string Name = "Value"; } ClassB { int ID = 456; ObservableCollection

我正在尝试创建一个ListView控件,该控件通过绑定到ObservableCollection来填充,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绑定到CollectionOfClassB集合,但是,用于生成行的datatemplate结构和后续绑定让我有点困惑

有人能帮我吗

非常感谢,

编辑:

上表中的第一列引用ClassC.CollectionOffClassB集合中索引对象的ID字段,每一行都是存储在CollectionOffClassB中的单个对象

CollectionOfClassB中存储的每个ClassB对象都有自己的CollectionOfClassA,我正试图将其放置在与其父对象相同的行的listview中。CollectionOfClassA中的每个类都是一个列

编辑2:

第一列由CollectionOffClassB中当前项的ClassB中的ID字段填充,后续列由CollectionOffClassA中每个项的数据填充。例如,列标题将是ClassA.ID,而内容将是ClassA.Name


我正在寻找可以实现这一点的XAML标记示例。

如果您知道
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>

当然,这不会使用内置的GridView功能,如排序

如果您知道
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>

当然,这没有使用内置的GridView功能,例如排序

,在您的示例中,您没有显示要显示CollectionOfClassA的位置。你打算在一行中显示类似子网格的东西吗?@VitorCanova编辑了我的原始帖子,希望澄清我试图实现的目标。这个例子已经重复了columns@Blam-正确,列应该是任意的。我只是想知道如何在XAML中生成这样一个布局,其中一个listview由多个源生成,这毫无意义。为什么要在两列中重复相同的数据?ListView只能有一个ItemsSource。中继器控件只能有一个ItemsSource。在您的示例中,您没有显示要在何处显示CollectionOfClassA。你打算在一行中显示类似子网格的东西吗?@VitorCanova编辑了我的原始帖子,希望澄清我试图实现的目标。这个例子已经重复了columns@Blam-正确,列应该是任意的。我只是想知道如何在XAML中生成这样一个布局,其中一个listview由多个源生成,这毫无意义。为什么要在两列中重复相同的数据?ListView只能有一个ItemsSource。中继器控件只能有一个ItemsSource。
<!-- 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>