我应该选择哪些ItemsControl以及为什么?

时间:2012-03-02 11:35:33

标签: wpf mvvm itemscontrol

我有一个任意数量的ViewModels要显示,我希望ViewModels显示在两列中。第一列主要应显示名称/描述,第二列的内容会有所不同。我希望第一列为Grid布局,第一列为Width = "auto",第二列为Width = "*"

我尝试使用ListView GridView,但有一些缺陷。

  • 我可以选择ListViewItem s(不需要)
  • GridViewColumns有标题(浪费空间/不需要)
  • GridViewColumns不支持Width = "*" Grid,因此不会使用所有可用空间

我可以使用Grid,但我必须为每个ViewModel添加Grid.RowDefinitions,并且无法通过Binding设置Grid.Row属性。

我还考虑使用StackPanel,但这不支持模板化,我不知道如何同步第一列的Width

那么,有人知道哪个ItemControl最适合这个目的吗?

2 个答案:

答案 0 :(得分:1)

如果不进行测试,我希望带有数据模板的ItemsControl是一个合适的解决方案。 您可以在父元素上使用Grid.IsSharedSizeScope =“true”,在本例中为ItemsControl,然后使用SharedSizeGroup =“somename”同步第一列的宽度。

<Grid>
    <Grid.Resources>
        <DataTemplate x:Key="itemTemplate" DataType="{x:Type MyItemType}">
            <Grid>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition SharedSizeGroup="column1" Width="Auto"/>
                    <ColumnDefinition/>
                </Grid.ColumnDefinitions>

                <TextBlock Text="{Binding Title}"/>

                <!-- More stuff here -->
            </Grid>
        </DataTemplate>
    </Grid.Resources>
    <ItemsControl Grid.IsSharedSizeScope="True" ItemTemplate="{StaticResource itemTemplate}" />
</Grid>

答案 1 :(得分:1)

我会使用带有Grid作为模板的ListBox,如下所示:

<ListBox ItemsSource="{Binding SomeData}" HorizontalContentAlignment="Stretch">
            <ListBox.ItemTemplate>
                <DataTemplate>
                    <Grid>
                        <Grid.ColumnDefinitions>
                            <ColumnDefinition Width="Auto" />
                            <ColumnDefinition Width="*" />
                        </Grid.ColumnDefinitions>
                        <TextBlock Text="{Binding Data1}" Grid.Column="0"></TextBlock>
                        <TextBlock Text="{Binding Data1}" Grid.Column="1"></TextBlock>
                    </Grid>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>