Domanda Griglia WPF come ItemsPanel per un elenco associato dinamicamente ad ItemsControl


Sto usando una griglia come ItemsPanel per una lista vincolata dinamicamente ad un ItemsControl. Il codice sotto funziona - con un problema rimanente: non riesco a trovare un modo per inizializzare dinamicamente ColumnDefinitions e RowDefinitions della griglia. Di conseguenza tutti i valori sono posti l'uno sopra l'altro.

<ItemsControl ItemsSource="{Binding Cells}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid/>
        </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>
            <TextBlock Text="{Binding Value}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

Si prega di essere consapevole, che sto cercando una risposta secondo il modello MVVM. Pertanto la sub classing e il code behind sono solo soluzioni alternative, ma nessuna soluzione.


11
2017-08-09 12:00


origine


risposte:


Avrai bisogno di un modo per dire alla Griglia quante Righe / Colonne ha. Forse come ogni articolo caricato puoi controllare il valore di RowIndex e ColumnIndex e aggiungi Righe / Colonne alla Griglia, se necessario.

Come un'altra alternativa, forse puoi esporre RowCount e ColumnCount proprietà nel ViewModel che restituiscono il massimo RowIndex e ColumnIndexe nell'evento Caricamento della griglia aggiungi comunque molte colonne / righe di cui hai bisogno.

Trovo perfettamente accettabile utilizzare code-behind in MVVM SE il codice è solo relativo all'interfaccia utente.

Un'altra idea sarebbe quella di disporre i tuoi elementi nel tuo code-behind in una griglia 2D prima di restituirlo alla vista, e quindi legare quella griglia a un DataGrid con AutoGenerateColumns=True e le intestazioni rimosse

Aggiornare

La mia attuale soluzione a questo problema è usare un set di AttachedProperties per un Grid che ti permettono di legare RowCount e ColumnCount proprietà a una proprietà su ViewModel

Puoi trovare il codice per la mia versione delle proprietà allegate sul mio blog Quie possono essere utilizzati in questo modo:

<ItemsPanelTemplate>
    <Grid local:GridHelpers.RowCount="{Binding RowCount}"
          local:GridHelpers.ColumnCount="{Binding ColumnCount}" />
</ItemsPanelTemplate>

20
2017-08-09 14:31



La tua griglia ha zero righe e colonne, quindi tutto sarà visualizzato l'uno sopra l'altro. Fai qualcosa come qui sotto e funzionerà.

<ItemsControl ItemsSource="{Binding Cells}">
    <ItemsControl.ItemsPanel>
        <ItemsPanelTemplate>
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto" />
                    <RowDefinition Height="Auto" />
                </Grid.RowDefinitions>
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="Auto" />
                    <ColumnDefinition Width="Auto" />
                </Grid.ColumnDefinitions>
            </Grid>
        </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>
            <TextBlock Text="{Binding Value}" />
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

3
2017-08-09 13:17