WPF Datagrid, das benutzerdefinierte Spaltenüberschriften bindet

8

Ich versuche herauszufinden, wie Sie den Spaltenkopf und die Hauptdaten eines WPF-DataGrid mithilfe eines MVVM-Musters an eine Datenquelle binden. Das Ergebnis, nach dem ich suche, würde so aussehen:

alt text http://brian.vallelunga.com/files/datagrid-custom-headers.PNG

Ich habe die Header hier erfolgreich formatiert, aber ich bin nicht sicher, wie man die Werte in den Headern bindet. Insbesondere die IsChecked-Eigenschaft des Kontrollkästchens, der ausgewählte Index des Kombinationsfelds und der Wert des Textfelds.

Ich habe zuvor eine einfache DataTable verwendet, um die Hauptgitterdaten zu füllen, aber ich brauche etwas Komplexeres, um sowohl die Gitterdaten als auch die Werte für jede Spalte aufzunehmen. Oder ich kann sie als separate Entitäten speichern.

Hat also irgendjemand eine Vorstellung davon, wie ich diese Bindung ziehen könnte? Eine Einschränkung besteht darin, dass die Spalten automatisch generiert werden müssen, da ich bis zur Laufzeit keine Ahnung habe, was sie sein werden. Die Anwendung lädt einfach die Daten aus einer Excel-Tabelle und es kann eine beliebige Anzahl von Spalten vorhanden sein.

Danke, Brian

    
Brian Vallelunga 03.02.2010, 04:20
quelle

3 Antworten

7

Hier ist, was ich getan habe, um dies mit dem MVVM-Muster zu verwenden:

Ich habe zwei Sätze von Daten für die Bindung an mein Ansichtsmodell: eine für die tatsächlichen Gitterdaten und eine für die Spaltenüberschriften. Gegenwärtig werden diese als zwei Eigenschaften herausgestellt:

%Vor%

Der Trick, mit zwei unterschiedlichen Datensätzen zu arbeiten, liegt im Raster. Ich habe das DataGrid unterklassifiziert und dem Gitter eine zusätzliche Datenquelle namens ColumnSource als Abhängigkeitseigenschaft gegeben. Dies ist, was an die ColumnData in meinem Ansichtsmodell gebunden ist. Ich setze dann den Header jeder automatisch generierten Spalte auf die entsprechend indizierten Daten in der ColumnSource-Datenquelle. Der Code ist wie folgt:

%Vor%

Ich kann jetzt eine normale Datenbindung im Template-Header meiner Spalten durchführen, die alle gegen die Daten in der ColumnData-Eigenschaft meines View-Modells binden.

UPDATE: Ich wurde gebeten, den XAML für mein Raster zu zeigen. Es ist wirklich einfach, aber hier ist es:

%Vor%

Und hier ist der ImporterColumnHeaderStyle:

%Vor%     
Brian Vallelunga 09.02.2010, 14:50
quelle
0

Ich bin definitiv ein WPF / MVVM / Databinding-Noob, aber ich habe in letzter Zeit hart an diesem Thema gearbeitet. Ich weiß nicht, was Sie bisher verdrahtet haben, aber zuerst sollten Sie den DataContext für Ihre Ansicht einstellen. Da Sie MVVM verwenden, nehme ich an, Sie haben ein ViewModel, also sollte dies der DataContext für Ihre View sein.

d. Wenn Ihre View Ihr ViewModel erstellt / besitzt, könnte es in etwa so aussehen:

%Vor%

Sie können Ihre CheckBox, ComboBox und TextBox einfach an Eigenschaften in Ihrem ViewModel anbinden. Ich habe gefunden, dass der einfachste Weg ist, Ihr ViewModel von einer Basis-Viewmodel-Klasse zu übernehmen, wie die eine, die Josh Smith schrieb . Dadurch erhalten Sie eine Methode, die Sie intern aufrufen können, wenn das ViewModel die GUI über Änderungen der Werte benachrichtigen soll.

Angenommen, Sie haben Eigenschaften wie ImportColumn, LastName und LastNameText (alle C # -Eigenschaften, nicht Felder , die OnPropertyChanged entsprechend aufrufen), dann würde Ihr XAML ungefähr so ​​aussehen:

%Vor%

Ich hoffe, dass dir das hilft. Wenn nicht, bitte Kommentar und ich werde versuchen, so gut ich kann, um andere Dinge auszuprobieren.

    
Dave 03.02.2010 05:59
quelle
0

Wir machen etwas ähnliches in unserer App.

Was ich getan habe ist, meinen eigenen Spaltentyp (DataGridSearchableBooleanColumn) abzuleiten, dann ersetze ich die DataGridColumnHeader Vorlage, ich lege zwei Content Presenter hinein. die erste bind ich an den Inhalt (die gleiche wie die Standardvorlage) die zweite ich binde an die Spalte. Ich benutze eine Datenvorlage für die Spalte (ich habe ein paar von ihnen für verschiedene Sucharten (Text, Combo, Boolean). Dann füge ich die zusätzlichen Eigenschaften der Spalte, so dass ich an sie binden kann. Sehen Sie, wenn dieser Code Sinn macht.

%Vor%     
Aran Mulholland 03.02.2010 23:04
quelle