/ / Bindung an eine ObservableCollection <T> und Verwendung eines ValueConverter - c #, wpf, xaml, Datenbindung, observablecollection

Bindung an eine ObservableCollection <T> und Verwendung eines ValueConverters - c #, wpf, xaml, Datenbindung, observablecollection

Ich versuche zu binden ObservableCollection<T> zu einem TreeView (oder eine andere Kontrolle für diese Angelegenheit) über a ValueConverter. Im ValueConverter verwende ich den AsHierarchy Erweiterung (scip.be), um eine Selbstreferenzierung (jede Entität verfügt über ein ParentId-Feld) in eine Hierarchie.

Wie bereits erwähnt, speichere ich meine (flache Liste von) Entitäten in einem ObservableCollection<T> Die Aktualisierungen der Liste werden in der Ansicht (GUI) angezeigt, wenn ich den ValueConverter nicht verwende.

Wenn ich die hinzufügen ValueConverterDie Aktualisierungen werden nicht mehr in meiner Ansicht angezeigt. Wenn ich einen Haltepunkt im Wertkonverter setze, stelle ich fest, dass er nur einmal beim Laden aufgerufen wird und alle weiteren CollectionChanged-Ereignisse ignoriert.

Quellcode des ValueConverter:

public class HierarchyValueConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return null;
ObservableCollection<Entity> data = (ObservableCollection<Entity>)value;
return data.AsHierarchy(p => p.Id, p => p.ParentId);
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

Die ItemsSource, an die ich den Konverter binde:

ItemsSource="{Binding Data,
Source={StaticResource MyDataSource},
Converter={StaticResource HierarchyValueConverter}}"

Ich hoffe, jemand kann eine Antwort geben, da mich das schon seit einiger Zeit nervt.

Vielen Dank im Voraus!

Antworten:

1 für die Antwort № 1

Eine beobachtbare Bindung einer Hierarchie wird mit großer Wahrscheinlichkeit nicht durch eine Erweiterungsmethode gelöst.

Ich würde vorschlagen, dass Sie Ihre eigene Utility-Klasse implementieren, etwa die CompositeCollection aber zielte natürlich auf einen hierarchischen Aufbau,Wenn Sie einen ganzen Artikel hinzufügen, wird der gesamte Baum neu aufgebaut. Dies ist möglicherweise keine triviale Aufgabe, aber das ist die allgemeine Richtung, die ich empfehlen würde.


0 für die Antwort № 2

ObservableCollection implementiert eine SchnittstelleINotifyCollectionChanged, das Ihre Artikelsteuerung darüber informiert, dass sich etwas geändert hat. AsHierarchy gibt nur ein IEnumerable zurück, das keine Änderungsbenachrichtigung bereitstellt, und daher werden keine Updates mehr angezeigt.

Die schnelle und unkorrekte Lösung besteht darin, das CollectionChanged-Ereignis von ObservableCollection zu abonnieren. Erzwingen Sie im Event-Handler eine erneute Bindung, damit die Convert-Methode des Wertkonverters erneut ausgeführt wird.