Frage

Ich habe ein Raster mit nur 1 Zeile. Ich mag die Menge an Spalten, die durch den Datenkontext des Rasters bestimmt werden.

Zum Beispiel, wenn ich eine Liste von Namen in einer ObservableCollection Eigenschaft namens ‚Namen‘, dass die Rückkehr „Fred“, „Joe“ und „Anne“ ausgesetzt habe, würde mir drei Spalten im Raster gefallen, die jeweils mit einem Textfeld gebunden zu jedem Namen.

Meine Gedanken so weit:

1) Erstellen Sie das Gitter mit der Hand in der Code-behind und es wieder aufzubauen, wenn die ObservableCollection Änderungen. Ich habe nicht mit diesem gehen, wie es ein wenig cludgy schien und nicht die WPF Art und Weise, Dinge zu tun.

2) Erstellen Sie eine Bindung mit dem ColumnDefinitions Eigenschaft Grid. Dies schien mehr richtig, aber es gibt keine Abhängigkeitseigenschaft auf dem Gitter für Column.

War es hilfreich?

Lösung

Ich glaube nicht, ein Grid on the fly Modifizierung ist die beste Wahl. Hier ist eine andere Lösung. Sie können List-Box verwenden, aber die Itemspanel mit einem anderen Panel Ihrer Wahl ersetzen. List-Box-Standarditemspanel ist VirtualizingStackPanel mit Orientierungssatz Vertikale. Da Sie Ihre Elemente horizontal angezeigt werden sollen, können Sie es mit VirtualizingStackPanel mit Orientierung ersetzen auf Horizontal . Natürlich können Sie die ItemsTemplate oder irgendetwas anderes ändern, wie Sie für richtig halten.

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

Ich habe auch diese Methode verwendet, bevor Sie eine List-Box zu schaffen, die die Elemente horizontal angezeigt wird, sondern auf die nächste Zeile umgebrochen wird, wenn es aus dem Zimmer auf der Linie verläuft, durch eine WrapPanel verwenden. Sie können auch Ihre eigenen Panels erstellen und ersetzen sie. Ich habe einmal eine Platte, die zufällig es Stücke angelegt und verwendet, dass für eine List-Box. Jedes Element in meiner gebundenen Sammlung wurde in einer zufälligen Position innerhalb der List-Box angezeigt. Jedes Mal, wenn das Layout aufgefrischt, bekamen die Elemente eine neue Position.

Andere Tipps

Wenn es ein Datagrid , die Autogeneratecolumns Eigenschaft würde dies tun. Durch die Verwendung des Datagridtemplatecolumn , können Sie Textfeld-Steuerelemente, statt nur Text in dort setzen. Sie benötigen ein Ereignis an den AutoGeneratingColumn und in der AutoGeneratingColumnEventArgs (hallo, Microsoft, diese carpel Tunnel Berufung), die Column-Eigenschaft auf eine Vorlagenspalte mit dem Textfeld gesetzt.

Ich würde sagen, Ihre ObservableCollection Weise einfacher ;-P ist.

Wenn Sie annehmen können in jeder Zeile die Namen, die nicht jeder Spalte, sollten Sie die Listview mit einem Gridview-View-Eigenschaft verwenden, und eine benutzerdefinierte Celltemplate, das nur eine gebundene Textbox ist. So etwas wie folgt aus:

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

Lösung 2 ist leider nicht möglich in XAML. Lösung 1 ist die beste Wahl, wenn Sie jeden Namen in einer eigenen Spalte haben muss.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top