Какой элемент управления следует выбрать и почему? - PullRequest
0 голосов
/ 02 марта 2012

У меня есть произвольное количество ViewModels для отображения, и я хочу, чтобы ViewModels отображались в двух столбцах. Первый столбец в основном должен отображать имя / описание, а содержание второго столбца меняется. Я бы предпочел Grid -подобный макет с Width = "auto" для первого столбца и Width = "*" для второго столбца.

Я пробовал ListView с GridView, но в этом есть некоторые недостатки.

  • Я могу выбрать ListViewItem s (не обязательно)
  • GridViewColumns есть заголовки (пустое пространство / не нужно)
  • GridViewColumns не поддерживает Width = "*" как Grid и поэтому не использует все доступное пространство

Я мог бы использовать Grid, но мне нужно было бы добавить Grid.RowDefinitions для каждой ViewModel, и было бы невозможно установить свойство Grid.Row через Binding.

Я также думал об использовании StackPanel, но он не поддерживает Templating, и я не знаю, как синхронизировать Width для первого столбца.

Итак, кто-нибудь знает, какой ItemControl лучше всего подходит для этой цели?

Ответы [ 2 ]

1 голос
/ 02 марта 2012

Я бы использовал 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>
1 голос
/ 02 марта 2012

Без тестирования я бы ожидал, что 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>
...