2016-09-01 3 views
1

Angenommen, ich habe eine Hauptdatenbankklasse, TvShowDatabase, die eine Liste von Shows enthält. Jede Show hat eine Liste von Episodes, von denen jede eine Length hat. Die Objekte TvShowDatabase, Show und Episode implementieren alle INotifyPropertyChanged.Aggregate bindbarer Objekte in WPF neu zuordnen?

Ich möchte und TotalViewingPotential, eine Eigenschaft von TvShowDatabase, die die Length jedes Episode jedes Show summiert zeigen berechnen.

Nehmen wir an, der Benutzer betrachtet diese Struktur in einem Baumstil und kann die Length eines beliebigen Show bearbeiten. Wenn sie dies tun, sollte die TotalViewingPotential entsprechend aktualisiert werden, und die Ergebnisse werden auf dem Bildschirm angezeigt.

Meine Frage: In WPF (und speziell mit Prism für MVVM), was ist der beste Weg, die Installation für diese Änderungsbenachrichtigungen anzuschließen?

Ich habe in Betracht gezogen, jede Liste abzufangen (mit ObservableCollection) und jedem neuen Artikel eine Parent zu geben. Dies wird jedoch unordentlich, und ein Top-Down-Ansatz ist vorzuziehen.

Ich habe hyper beobachtbaren Sammlungen zu sehen (http://www.codeproject.com/Tips/694370/How-to-Listen-to-Property-Chang), aber ich mache mir Sorgen über Event-Abo-basierten Speicherlecks mit dieser Methode, und es erfordert noch ein gutes Stück von manuellen Sanitär die OnPropertyChanged(TotalViewingCollection) Ereignisse zu erhöhen, wo nötig.

Gibt es ein Muster dafür?

+0

Sie können Reactive Extensions für .NET betrachten, leider habe ich gerade angefangen, es zu betrachten, also fühle ich mich nicht wohl, Ihnen Ratschläge darüber zu geben –

Antwort

0

Die Aufgabe, wie Sie es beschreiben, hat eine einfache Lösung. Sie müssen Änderungen nicht entlang der Sammlungen propagieren.

TotalViewingPotential ist eine normale INotifyPropertyChanged-Eigenschaft. Machen Sie es über Ihre Längeneigenschaften zugänglich.

Berechnen Sie im Setter der Eigenschaft Length die Differenz zwischen den neuen und den alten Werten, und erhöhen Sie das TotalViewingPotential um den Unterschied.

Das ist alles.

Um das erstmalige Laden zu beschleunigen, können Sie die Werte der Hintergrundfelder von Lengths festlegen und TotalViewingPotential basierend auf den Werten aus dem DB berechnen, um keine Benachrichtigungen für alle Längen zu generieren.