Domanda

Ho una griglia con solo 1 riga. Vorrei che la quantità di colonne fosse determinata dal contesto dei dati della griglia.

Ad esempio, se ho un elenco di nomi esposti in una proprietà ObservableCollection chiamata "Nomi" che restituiscono "Fred", "Joe" e "Anna", vorrei tre colonne nella griglia, ciascuna con una casella di testo associata a ciascun nome.

I miei pensieri finora:

1) Costruisci la griglia manualmente nel code-behind e ricostruiscila quando cambia ObservableCollection. Non ci sono andato perché sembrava un po 'maldestro e non il modo di fare le cose del WPF.

2) Crea un'associazione con la proprietà ColumnDefinitions della griglia. Sembrava più corretto, ma non esiste una proprietà di dipendenza nella griglia per ColumnDefinition.

È stato utile?

Soluzione

Non penso che modificare una griglia al volo sia la soluzione migliore. Ecco un'altra soluzione. Puoi utilizzare ListBox, ma sostituisci ItemsPanel con un altro pannello di tua scelta. ItemsPanel predefinito di ListBox è VirtualizingStackPanel con Orientamento impostato su Verticale. Poiché desideri che i tuoi articoli vengano visualizzati in orizzontale, puoi sostituirli con VirtualizingStackPanel con Orientamento impostato su Orizzontale . Ovviamente, puoi modificare il ItemsTemplate o qualsiasi altra cosa tu ritenga opportuno.

<ListBox ItemsSource="{Binding MyCollection}">
    <ListBox.ItemsPanel>
        <ItemsPanelTemplate>
            <VirtualizingStackPanel Orientation="Horizontal"/>
        </ItemsPanelTemplate>
    </ListBox.ItemsPanel>
</ListBox>

Ho anche usato questo metodo prima di creare un ListBox che visualizza gli elementi in orizzontale, ma passa alla riga successiva quando si esaurisce lo spazio sulla riga, usando un WrapPanel. Puoi anche creare i tuoi pannelli personalizzati e sostituirli. Una volta ho creato un pannello che ha disposto gli elementi in modo casuale e l'ho usato per un ListBox. Ogni elemento nella mia raccolta rilegata veniva visualizzato in una posizione casuale all'interno di ListBox. Ogni volta che il layout viene aggiornato, gli elementi ottengono una nuova posizione.

Altri suggerimenti

Se si tratta di DataGrid , AutoGenerateColumns lo farebbe. Utilizzando DataGridTemplateColumn , puoi inserire i controlli della casella di testo anziché solo il testo. Dovrai fornire un evento associato a AutoGeneratingColumn e in AutoGeneratingColumnEventArgs (ciao, Microsoft, questa è la chiamata del tunnel carpello), imposta la proprietà Column su una colonna modello con la casella di testo.

Direi che il tuo modo ObservableCollection è più semplice ;-P.

Se puoi accettare di avere i nomi in ogni riga anziché in ogni colonna, dovresti usare ListView con una proprietà GridView View e un CellTemplate personalizzato che è solo una casella di testo associata. Qualcosa del genere:

<ListView ItemsSource="{Binding Names}">
  <ListView.View>
    <GridView>
      <GridViewColumn>
        <GridViewColumn.CellTemplate>
          <!-- Your textbox goes in a DataTemplate here -->             
        </GridViewColumn.CellTemplate>
      </GridViewColumn>
    </GridView>
  </ListView.View>
</ListView>

Purtroppo la soluzione n. 2 non è possibile in XAML. La soluzione n. 1 è la soluzione migliore se devi avere ciascun nome nella sua colonna.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top