ObservableCollection的ObservableCollection网格

时间:2012-05-05 15:47:01

标签: c# wpf observablecollection

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

我希望网格的第一列列出集合对象中的项目,以便每一行都包含集合ObservableCollections中的一个项目的CollectionTitle。对于第二列,我希望每一行都包含与相应集合对象关联的MyCollectionItems项集。

从上面的代码:

  1. 收藏品为'c'
  2. 项目为'i'
  3. +---------------------------------------------------------------------------------------------+
    +        |       Column 0          |                        Column 1                          |
    +---------------------------------------------------------------------------------------------|
    + Row 0  |  c[0].CollectionTitle   | c[0].i[0].ItemTitle ...i[1].ItemTitle ... i[2].ItemTitle |
    + Row 1  |  c[1].CollectionTitle   | c[1].i[0].ItemTitle ...i[1].ItemTitle ... i[2].ItemTitle |
    +        |                         |                                                          |
    + ...                                                                                         |
    +---------------------------------------------------------------------------------------------+
    

    如果我有一组静态的MyNewCollection对象,但由于它可以增长到无穷大,这本来很容易,我需要创建一个新的MyNewCollection对象的ObservableCollection,这就是我在理解如何做的时候遇到麻烦的地方这与WPF。任何帮助将不胜感激。

    感谢。

2 个答案:

答案 0 :(得分:2)

这是使用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
}

答案 1 :(得分:0)

我只是简单地使用C#,但是,如果我没记错,当你不能直接绑定时,你应该编写一个自定义ValueConverter类,它处理你的MyCollectionItem元素,然后在绑定中使用它。