这是一个有趣的案例,我无法在线找到任何信息。我正在尝试创建一个网格,并需要将ObservableCollection的ObservableCollection绑定到它。想象一个这样的模型:
public class App
{
private ObservableCollection<MyNewCollection> collections;
}
public class MyNewCollection : DependencyObject
{
public ObservableCollection<MyCollectionItem> items;
// ... public properties: string CollectionTitle
}
public class MyCollectionItem : DependencyObject
{
// ... public properties: string ItemTitle
}
我希望网格的第一列列出collections对象中的项目,以便每一行将包含Collections ObservableCollections中的一个项目的CollectionTitle。对于第二列,我希望每一行都包含与适当的集合对象关联的MyCollectionItems项目集。
从上面的代码:
集合为“ c”
项目为“ i”
+ ------------------------------------------------- -------------------------------------------- +
+ |列0 |第1栏|
+ ------------------------------------------------- -------------------------------------------- |
+第0行| c [0] .CollectionTitle | c [0] .i [0] .ItemTitle ... i [1] .ItemTitle ... i [2] .ItemTitle |
+第1行| c [1] .CollectionTitle | c [1] .i [0] .ItemTitle ... i [1] .ItemTitle ... i [2] .ItemTitle |
+ | | |
+ ... |
+ ------------------------------------------------- -------------------------------------------- +
如果我有一组静态的MyNewCollection对象,这会很容易,但是由于它会增长到无穷大,因此我需要为MyNewCollection对象创建一个新的ObservableCollection,这就是我在理解如何使用WPF进行操作时遇到麻烦的地方。任何帮助将不胜感激。
谢谢。
最佳答案
这是使用ItemsControl的一种方法,其中每行包含另一个ItemsControl。
Xaml:
<Page.Resources>
<DataTemplate x:Key="ChildItemTemplate"
DataType="{x:Type Samples:NestedCollectionItem}">
<TextBlock Text="{Binding Title}" Margin="5"/>
</DataTemplate>
<ItemsPanelTemplate x:Key="ChildItemPanel">
<StackPanel Orientation="Horizontal"/>
</ItemsPanelTemplate>
<DataTemplate x:Key="ItemTemplate"
DataType="{x:Type Samples:NestedCollectionChildViewModel}">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" SharedSizeGroup="c1"/>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<TextBlock VerticalAlignment="Center" Text="{Binding Title}"/>
<ItemsControl
Grid.Column="1"
ItemsSource="{Binding Items}"
ItemsPanel="{StaticResource ChildItemPanel}"
ItemTemplate="{StaticResource ChildItemTemplate}"
/>
</Grid>
</DataTemplate>
</Page.Resources>
<Page.DataContext>
<Samples:NestedCollectionRootViewModel/>
</Page.DataContext>
<Grid>
<ItemsControl
Grid.IsSharedSizeScope="True"
ItemsSource="{Binding Items}"
ItemTemplate="{StaticResource ItemTemplate}"/>
</Grid>
代码:
public class NestedCollectionRootViewModel
{
public NestedCollectionRootViewModel()
{
Items =
new ObservableCollection<NestedCollectionChildViewModel>
{
new NestedCollectionChildViewModel
{
Title = "Item 1",
Items =
new ObservableCollection<NestedCollectionItem>
{
new NestedCollectionItem {Title = "One"},
new NestedCollectionItem {Title = "Two"},
new NestedCollectionItem {Title = "Three"},
new NestedCollectionItem {Title = "Four"},
}
},
new NestedCollectionChildViewModel
{
Title = "Item 2",
Items =
new ObservableCollection<NestedCollectionItem>
{
new NestedCollectionItem {Title = "Five"},
new NestedCollectionItem {Title = "Six"},
}
},
};
}
public ObservableCollection<NestedCollectionChildViewModel> Items
{ get; private set; }
}
public class NestedCollectionChildViewModel
{
public string Title { get; set; }
public ObservableCollection<NestedCollectionItem> Items { get; set; }
}
public class NestedCollectionItem
{
public string Title { get; set; }
// ... etc
}