grade wpf com colunas dinâmicas
Eu tenho uma coleção que desejo vincular a uma grade do WPF.
O problema que estou enfrentando é que o número de colunas é dinâmico e depende de uma coleção. Aqui está um simples simulado:
public interface IRows
{
string Message{get;}
IColumns[] Columns{get;}
}
public interface IColumns
{
string Header {get;}
AcknowledgementState AcknowledgementState{get;}
}
public interface IViewModel
{
ObservableCollection<IRows> Rows {get;}
}
Eu quero meu modo de exibição para vincular à coleção de linhas, que contém uma coleção de colunas.
A coleção My Columns contém um enum que deve ser representado por uma imagem (1 de 3 possibilidades). Ele também contém uma propriedade Message que só deve ser exibida em uma coluna (estática e é apenas alguma informação de texto). Ele também contém uma string de cabeçalho que deve ser exibida como um cabeçalho para essa coluna.
Observe que o número de colunas é variável (no momento em que os cabeçalhos são definidos como Reconhecer, mas isso será alterado para representar dados dinâmicos).
Atualização: Isto é depois de implementar sugestões de Rachel
<ItemsControl
ItemsSource="{Binding Items, Converter={StaticResource PresentationConverter}}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid ShowGridLines="true"
local:GridHelpers.RowCount="{Binding RowCount}"
local:GridHelpers.ColumnCount="{Binding ColumnCount}" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemContainerStyle>
<Style>
<Setter Property="Grid.Row" Value="{Binding RowIndex}"/>
<Setter Property="Grid.Column" Value="{Binding ColumnIndex}"/>
</Style>
</ItemsControl.ItemContainerStyle>
<ItemsControl.ItemTemplate>
<DataTemplate>
<ContentControl Content="{Binding}">
<ContentControl.Resources>
<DataTemplate DataType="{x:Type UI:MessageEntity}">
<TextBox Text="{Binding Message}"></TextBox>
</DataTemplate>
<DataTemplate DataType="{x:Type UI:StateEntity}">
<TextBox Text="{Binding State}"></TextBox>
</DataTemplate>
</ContentControl.Resources>
</ContentControl>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Isso quase me dá o que eu quero agora. Eu só estou preso com o que devo fazer para os cabeçalhos. Todas as sugestões são bem vindas.