/ / Quale ItemControl dovrei scegliere e perché? - wpf, mvvm, itemscontrol

Quale ItemControl dovrei scegliere e perché? - wpf, mvvm, itemscontrol

Ho un conteggio arbitrario di ViewModels perdisplay e voglio che ViewModels sia visualizzato in due colonne. La prima colonna dovrebbe mostrare principalmente un nome / descrizione e il contenuto della seconda colonna varia. Preferirei a Grid-come layout con un Width = "auto" per la prima colonna e Width = "*"per la seconda colonna.

Ho provato a ListView con un GridView ma questo ha alcuni difetti.

  • Posso selezionare il ListViewItems (non necessario)
  • GridViewColumns avere intestazioni (spazio sprecato / non necessario)
  • GridViewColumns non supportare Width = "*" come un Grid e quindi non utilizza tutto lo spazio disponibile

Potrei usare a Grid, ma che avrei dovuto aggiungere Grid.RowDefinitions per ogni ViewModel e non sarebbe possibile impostare il Grid.Row Proprietà tramite associazione.

Ho anche pensato di usare a StackPanel, ma ciò non supporta Templating e non so come sincronizzare Width per la prima colonna.

Quindi, qualcuno sa quale ItemControl è più adatto a questo scopo?

risposte:

1 per risposta № 1

Senza testarlo mi aspetterei un ItemsControlcon un modello di dati per essere una soluzione adatta. È possibile utilizzare Grid.IsSharedSizeScope = "true" su un elemento padre, in questo caso ItemsControl, quindi sincronizzare la larghezza della prima colonna utilizzando 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 per risposta № 2

Vorrei utilizzare un ListBox con una griglia come modello come questo:

<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>