这是一个有趣的案例,我无法在网上找到任何信息。我正在尝试创建一个网格,并需要绑定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项集。
从上面的代码:
+---------------------------------------------------------------------------------------------+ + | 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。任何帮助将不胜感激。
感谢。
答案 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元素,然后在绑定中使用它。