这是一个有趣的案例,我无法在线找到任何信息。我正在尝试创建一个网格,并需要将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
}

10-08 16:00