Ich habe eine Sammlung von Objekten in einem CollectionViewSource
gespeichert und an eine DataGrid
gebunden. Ich möchte eine 'Detailansicht' des aktuell ausgewählten Objekts im DataGrid
anzeigen. Ich kann das aktuelle Objekt mit CollectionViewSource.View.CurrentItem
erhalten.WPF: Dynamische Bindung einer Liste an (einige) Eigenschaften eines Objekts
MyClass
{
[IsImportant]
AProperty{}
AnotherProperty{}
[IsImportant]
YetAnotherProperty{}
}
Was würde ich tun möchte, ist Display ein Label (mit dem Eigenschaftsnamen) und eine Steuerung (für die Bearbeitung) in einer Listbox, für jede dieser Eigenschaften mit dem IsImportant
Attribute gekennzeichnet. Die Bindung muss zwischen den vorgenommenen Änderungen, dem DataGrid und dem Sicherungsobjekt funktionieren. Das angezeigte Steuerelement sollte basierend auf dem Typ der Eigenschaft variieren, der entweder boolean
, string
oder IEnumerable<string>
sein kann (Ich habe eine IValueConverter
geschrieben, um zwischen aufzählbarer und durch Zeilentrennzeichen getrennter Zeichenfolge zu konvertieren).
Kennt jemand eine Methode, um dies zu erreichen? Ich kann zur Zeit der Werte der Eigenschaften durch die folgende Anzeige, aber bearbeite sie würde die Unterstützung Objekt nicht aktualisieren:
listBox.ItemsSource = from p in typeof(MyClass).GetProperties()
where p.IsDefined(typeof(IsImportant), false)
select p.GetValue(_collectionViewSource.View.CurrentItem, null);
Um zu klären, ich diese ‚automagically‘, passieren möchte, ohne manuell angeben Eigenschaftsnamen in das XAML. Wenn ich dynamisch zur Laufzeit XAML hinzufügen kann, basierend darauf, welche Eigenschaften mit Attributen markiert sind, wäre das auch in Ordnung.
Das sieht fantastisch; Ich werde es umsetzen, sobald ich eine Chance habe und Sie wissen lassen, wie es geht. Vielen Dank! –
Das funktioniert meistens super. Ich habe dem PropertyValueConverter gerade einen Null-Check hinzugefügt, da er beim ersten Setzen der Bindung ein Null-Objekt erhalten hat. Das einzige Problem ist, dass derzeit, wenn ich einen Wert für dieses Steuerelement ändere, es nicht zum Datagrid weitergeleitet wird. Vermutlich wird das Backing-Objekt geändert, da der geänderte Wert immer noch von itemscontrol angezeigt wird, aber das Grid nicht benachrichtigt wird. Hat das mit Binding zu tun? –
@Daniel: Ihr Objekt muss INotifyPropertyChanged implementieren, wenn Aktualisierungen, die von einem Steuerelement vorgenommen werden, in anderen Steuerelementen widergespiegelt werden sollen, die an dieselbe Eigenschaft gebunden sind. Sie müssen auch INotifyPropertyChanged für PropertyValue implementieren. Der PropertyValueConverter ist für die ItemsSource-Bindung selbst gedacht, was in einer Richtung erfolgt, so dass ConvertBack nicht aufgerufen wird und Binding.DoNothing keine Rolle spielt. – Quartermeister