2012-03-02 2 views
0

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

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

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

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

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

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

ответ

1

Без тестирования я ожидал бы, что ItemControl с шаблоном данных станет подходящим решением. Вы можете использовать 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> 
+0

Почему я всегда забываю, что-то вроде '' ShardeSizeGroup' и IsSharedSizeScope' существует? Большое спасибо. –

1

Я хотел бы использовать 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>