2013-05-02 4 views
7

Ich habe ein Modell, das INotifyPropertyChanged implementiert und es kann von einem Hintergrund Business-Thread aktualisiert werden. Das dazugehörige ViewModel implementiert auch INotifyPropertyChanged. Und ihr View bindet offensichtlich an ViewModel. Diese Ansicht kann an mehreren Stellen angezeigt werden, und mein Ziel ist, dass alle aktualisiert werden, wenn sich das Modell ändert.Wenn ein Modell INotifyPropertyChanged implementiert, wie sollte ViewModel das PropertyChanged-Ereignis registrieren/abmelden?

Ich weiß, dass ViewModel für PropertyChanged Ereignis von Model registrieren sollte. Aber ich weiß nicht wann und wo der beste Ort für diese An- und Abmeldung ist. Speziell über die Deregistrierung, da ich Angst habe, Hunderte von VM-Ereignishandlern auf dem Modell für die VM/Ansichten zu haben, die nicht mehr gezeigt werden.

Vielen Dank im Voraus.

Antwort

4

Ist es eine absolute Notwendigkeit für Sie, die Ansicht zu begrenzen, nicht direkt an das Modell zu binden?

Sie können das Modell als eine Eigenschaft auf der VM aussetzen und dann haben Ihre Ansicht direkt an sie binden damit nicht die VM zu INPC von Modell subscribe mit

so etwas wie:

public class MyViewModel: INotifyPropertyChanged { 
... 

private MyModel _model; 
public MyModel Model { 
    get { 
    return _model; 
    } 
    set { 
    if (value == _model) 
     return; 
    value = _model; 
    RaisePropertyChanged(() => Model); 
    } 
} 
... 

} 

und in xAML (wenn MyViewModel ist die DataContext):

<TextBlock Text="{Binding Model.ModelProperty}" /> 

Update:

Vielleicht ist das eine Hilfe für die Erschließung in die PropertyChanged Ereignisse von Models in einer „schwachen“ Mode

IWeakEventListener

das zentrale Ereignis Verwendung eines WeakEventManager Disposition ermöglicht die Handler für die Zuhörer zu sein Garbage Collected (oder manuell gelöscht), selbst wenn die Lebensdauer des Quellobjekts über die Listener hinausgeht.

, die in

Josh Smith's PropertyObserver

Diese hoffentlich sollte Ihr Problem lösen benötigen, um verwendet wird, um explizit abmelden?

+0

Vielen Dank für Ihre Antwort. Ich denke, es ist notwendig. Da muss ich die Daten des Modells manipulieren, um einfach gebunden und sauber sein zu können. – n0ne

+0

manipulieren Sie die Daten des Modells wo? in der VM? das ist auch nicht wirklich eine gute Übung. Sie sollten die Daten des Modells im Modell manipulieren, wenn dies der Fall ist, oder wenn es sich nur um eine Manipulation für das Rendering von Ansichten handelt, sollte es in einem Konverter sein. – Viv

+0

Ja, ich meinte irgendeine Art von Rendering. Das Rendern ist etwas kompliziert, das ist nicht nur eine einzige Eigenschaft-zu-Eigenschaft-Zuordnung, die ich einen Konverter verwenden kann. – n0ne

0

Ich habe dieses Problem gelöst, indem ich mich eingehängt habe, um Ereignisse beim Laden zu modellieren und sie beim Laden zu entfernen. Das Problem hierbei ist, dass das Ansichtsmodell Ereignisse verpassen kann, wenn es nicht auf dem Bildschirm angezeigt wird. Normalerweise aktualisiere ich die Daten beim Laden schnell.

OnLoad - Aktualisiert die VM-Daten von den Modell- und Hook-Ereignissen. OnUnLoad - entfernen Sie alle Haken, die Sie an Ort und Stelle gesetzt haben.

+0

Gute Idee! Was aber, wenn der Artikel beim Entladen nicht auf dem Bildschirm angezeigt wird? Die VM wird es vermissen und die Event Hooks bleiben dort für immer ... – n0ne

+0

Das Entladeereignis wird höchstwahrscheinlich ausgelöst, wenn das Objekt vom Bildschirm verschwindet, aber selbst wenn es geladen bleibt, wird es irgendwann entladen, wenn es nicht mehr ist erforderlich. – Andy

+0

@Andy, wenn etwas zu den Ereignissen Ihres Objekts (wie INPC) abonniert wird, wird es niemals Müll sammeln - Warum nicht einfach WeakEvents verwenden? – BrainSlugs83