WPF: Dynamische Bindung einer Liste an (einige) Eigenschaften eines Objekts

8

Ich habe eine Sammlung von Objekten, die in einem CollectionViewSource gespeichert und an ein DataGrid gebunden sind. Ich möchte eine Detailansicht des aktuell ausgewählten Objekts in DataGrid anzeigen. Ich kann das aktuelle Objekt mit CollectionViewSource.View.CurrentItem erhalten.

%Vor%

Ich möchte eine Beschriftung (mit dem Eigenschaftsnamen) und ein Steuerelement (zum Bearbeiten) in einer Listbox für jede dieser Eigenschaften anzeigen, die mit dem IsImportant -Attribut markiert sind. Die Bindung muss zwischen den vorgenommenen Änderungen, dem DataGrid und dem Sicherungsobjekt funktionieren. Das angezeigte Steuerelement sollte abhängig vom Typ der Eigenschaft variieren. Dies kann entweder boolean , string oder IEnumerable<string> sein (ich habe eine IValueConverter geschrieben, um zwischen aufzählbarer und durch Zeilentrennzeichen getrennter Zeichenfolge zu konvertieren).

Kennt jemand eine Methode, um das zu erreichen? Ich kann momentan die Werte jeder Eigenschaft durch die folgenden anzeigen, aber das Bearbeiten von ihnen würde das Sicherungsobjekt nicht aktualisieren:

%Vor%

Um dies klarzustellen: Ich möchte, dass dies "automatisch" geschieht, ohne Eigenschaftsnamen im XAML manuell anzugeben. Wenn ich zur Laufzeit dynamische XAML hinzufügen kann, abhängig davon, welche Eigenschaften mit Attributen gekennzeichnet sind das wäre auch in Ordnung.

    
Dan Imrie-Situnayake 30.06.2010, 19:11
quelle

1 Antwort

12

Sie möchten ein Steuerelement mit einem Label mit dem Eigenschaftsnamen und dem Steuerelement zum Bearbeiten des Eigenschaftswerts. Erstellen Sie daher zunächst eine Klasse, die eine Eigenschaft eines bestimmten Objekts als DataContext für dieses Steuerelement umschließt:

%Vor%

Sie möchten die ItemsSource einer ListBox an ein Objekt binden, um sie mit diesen Steuerelementen zu füllen, also erstellen Sie einen IValueConverter, der ein Objekt für seine wichtigen Eigenschaften in eine Liste von PropertyValue-Objekten konvertiert:

%Vor%

Der letzte Trick besteht darin, dass das Bearbeitungssteuerelement basierend auf dem Typ der Eigenschaft variieren soll. Sie können dies tun, indem Sie ein ContentControl verwenden und das ContentTemplate basierend auf dem Eigenschaftstyp auf eine der verschiedenen Editorvorlagen setzen. In diesem Beispiel wird eine CheckBox verwendet, wenn die Eigenschaft ein Boolescher Wert und eine TextBox ist, andernfalls:

%Vor%

Dann können Sie Ihre ListBox einfach als:

erstellen %Vor%     
Quartermeister 30.06.2010, 23:45
quelle

Tags und Links