Wpf 用于嵌套ObservableCollections数据绑定的数据模板
我正在尝试创建一个ListView控件,该控件通过绑定到ObservableCollection来填充,ObservableCollection本身包含另一个ObservableCollection,我需要从中在ListView中显示数据 为了澄清,我有一个对象层次结构,如下所示: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
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>