Wie man ein WPF-Gitter basierend auf einem zweidimensionalen Array auffüllt
Ich habe ein 2-dimensionales array von Objekten und ich wollen im Grunde databind jeweils zu einer Zelle in einer WPF-grid. Derzeit habe ich diese arbeiten, aber ich Tue die meisten es prozedural. Ich erstelle die richtige Anzahl von Zeilen-und Spaltendefinitionen, dann habe ich eine Schleife durch die Zellen und erstellen Sie die Steuerelemente und das einrichten der richtigen Bindungen für jeden.
Zumindest ich möchte in der Lage sein, um eine Vorlage zu verwenden, geben Sie die Kontrollen und Bindungen in xaml. Im Idealfall würde ich mag, um loszuwerden, der prozeduralen code und tun Sie es einfach alle mit databinding, aber ich bin mir nicht sicher, das ist möglich.
Hier ist der code den ich momentan verwende:
public void BindGrid()
{
m_Grid.Children.Clear();
m_Grid.ColumnDefinitions.Clear();
m_Grid.RowDefinitions.Clear();
for (int x = 0; x < MefGrid.Width; x++)
{
m_Grid.ColumnDefinitions.Add(new ColumnDefinition() { Width = new GridLength(1, GridUnitType.Star), });
}
for (int y = 0; y < MefGrid.Height; y++)
{
m_Grid.RowDefinitions.Add(new RowDefinition() { Height = new GridLength(1, GridUnitType.Star), });
}
for (int x = 0; x < MefGrid.Width; x++)
{
for (int y = 0; y < MefGrid.Height; y++)
{
Cell cell = (Cell)MefGrid[x, y];
SolidColorBrush brush = new SolidColorBrush();
var binding = new Binding("On");
binding.Converter = new BoolColorConverter();
binding.Mode = BindingMode.OneWay;
BindingOperations.SetBinding(brush, SolidColorBrush.ColorProperty, binding);
var rect = new Rectangle();
rect.DataContext = cell;
rect.Fill = brush;
rect.SetValue(Grid.RowProperty, y);
rect.SetValue(Grid.ColumnProperty, x);
m_Grid.Children.Add(rect);
}
}
}
InformationsquelleAutor der Frage Daniel Plaisted | 2008-11-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dem Zweck, das Gitter ist nicht für real-databinding, es ist nur ein panel. Ich Liste unten die einfachste Möglichkeit zum ausführen der Visualisierung eines zweidimensionalen Liste
Und in der code-behind gesetzt, die ItemsSource von lst mit einem TwoDimentional Datenstruktur.
Dieses gibt Ihnen den folgenden Bildschirm als Ausgabe. Bearbeiten können Sie die DataTemplate_Level2 hinzufügen, um spezifische Daten von Ihrem Objekt.
InformationsquelleAutor der Antwort Jobi Joy
Hier ist ein Steuerelement mit dem Namen
DataGrid2D
gefüllt werden können, basierend auf einer 2D-oder1D-array (oder irgendwas implementiert, dass die
IList
- Schnittstelle). Es UnterklassenDataGrid
und fügt eine Eigenschaft namensItemsSource2D
das ist für die Bindung an die 2D-oder 1D-Quellen. Bibliothek heruntergeladen werden kann hier und Quellcode kann heruntergeladen werden hier.Es nur verwenden, fügen Sie einen Verweis auf DataGrid2DLibrary.dll fügen Sie diesen namespace
erstellen und dann eine DataGrid2D und binden Sie es zu Ihrem IList, 2D-array oder ein 1D-array wie dieses
ALTE POST
Hier ist eine implementation, die binden können einen 2D-array, in das WPF-datagrid.
Sagen, wir haben dieses 2D-array
Und dann wollen wir binden dieses 2D-array, in das WPF-DataGrid und die Veränderungen, die wir machen werden, spiegelt sich in dem array. Dazu habe ich Eric Lippert ' s Ref-Klasse aus diese thread.
Dann machte ich eine statische helper-Klasse mit einer Methode, könnte mit einem 2D-array und zurück ein DataView-Objekt mit den Ref-Klasse oben.
Dieser würde schon fast genug zum binden, aber der Weg in die Bindung auf dem Ref-Objekt statt der Ref.Wert die wir brauchen, müssen wir also ändern, wenn die Spalten generiert.
Und nach diesem können wir verwenden
Und die Ausgabe wird wie folgt Aussehen
Änderungen in der
DataGrid
werden, spiegelt sich in der m_intArray.InformationsquelleAutor der Antwort Fredrik Hedblad
Schrieb ich eine kleine Bibliothek von angefügten Eigenschaften für die
DataGrid
.Hier ist die Quelle
Probe, wo Data2D ist
int[,]
:Macht:
InformationsquelleAutor der Antwort Johan Larsson
Möchten Sie vielleicht check out this link: http://www.thinkbottomup.com.au/site/blog/Game_of_Life_in_XAML_WPF_using_embedded_Python
Wenn du eine Liste innerhalb einer Liste, die Sie verwenden können, meineliste[x], [y], um den Zugriff auf eine Zelle.
InformationsquelleAutor der Antwort Torsten
Hier ist eine andere Lösung basiert auf Meleak's Antwort, aber ohne eine
AutoGeneratingColumn
Ereignisprozedur in den code hinter jeder gebundenenDataGrid
:InformationsquelleAutor der Antwort CitizenInsane