将2维集合绑定到某个控件

时间:2011-03-22 20:06:53

标签: .net wpf mvvm

我想绑定一个二维集合 - 复杂数据类型集合的集合。因此控件看起来像(n)富文本框的垂直列表(列)。

每个列表都有相同数量的记录。

一种方法是将数据从viewmodel传递给视图,然后以编程方式在xaml后面的代码中创建这些列表。但是我不想这样做,有什么更简单的东西吗?

2 个答案:

答案 0 :(得分:3)

只需使用数据绑定和数据模板:

<ItemsControl ItemsSource="{Binding MainCollection}">
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <ItemsControl ItemsSource="{Binding .}">
                <ItemsControl.ItemsPanel>
                    <ItemsPanelTemplate>
                        <StackPanel Orientation="Horizontal"/>
                    </ItemsPanelTemplate>
                </ItemsControl.ItemsPanel>
                <ItemsControl.ItemTemplate>
                    <RichTextBox Text="{Binding .}"/>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

因此外部ItemsControl以垂直StackPanel绑定到集合和渲染集合。对于该集合中的每个集合,都有一个内部ItemsControl。每个内部ItemsControl都会将其集合中的每个项目显示为水平RichTextBox中的StackPanel

显然,您需要根据需要修复绑定路径,并根据具体情况进行调整。

答案 1 :(得分:0)

 <ListBox ItemsSource="{Binding Data}" Grid.Row="1" 
         Padding="20" Background="Transparent" BorderBrush="Black">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <WrapPanel IsItemsHost="True" />
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
    <ListBox.ItemTemplate>
        <DataTemplate>
                <ListBox ItemsSource="{Binding}" BorderBrush="Black" BorderThickness="2">
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                        <Border BorderThickness="1" BorderBrush="Black" Padding="3" 
                                HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
                            <Grid Width="300">
                                <Grid.RowDefinitions>
                                    <RowDefinition/>
                                    <RowDefinition/>
                                    <RowDefinition />
                                    <RowDefinition />
                                    <RowDefinition />
                                    <RowDefinition />
                                    <RowDefinition />
                                    <RowDefinition />
                                </Grid.RowDefinitions>
                                <TextBlock Grid.Row="1" Text="{Binding Prop1}" />
                                <TextBlock Grid.Row="2" Text="{Binding Prop2}" />
                                <TextBlock Grid.Row="3" Text="{Binding Prop3}" />
                                <TextBlock Grid.Row="4" Text="{Binding Prop4}" />
                                <TextBlock Grid.Row="5" Text="{Binding Prop5, StringFormat=d}" />
                                <TextBlock Grid.Row="6" Text="{Binding Prop6,StringFormat=c}" />
                                <TextBlock Grid.Row="7" Text="{Binding Prop7,StringFormat=c}" />
                            </Grid>
                        </Border>
                    </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>