Si un modèle implémente INotifyPropertyChanged, comment ViewModel doit-il enregistrer / annuler l’enregistrement de l’événement PropertyChanged?

J’ai un modèle qui implémente INotifyPropertyChanged et il peut être mis à jour par un fil métier en arrière-plan. Son ViewModel associé implémente également INotifyPropertyChanged . Et leur vue se lie évidemment à ViewModel. Cette vue peut être affichée à plusieurs endroits et mon objective est que tous soient mis à jour lorsque le modèle change.

Je sais que ViewModel doit s’inscrire pour PropertyChanged événement PropertyChanged de Model. Mais je ne sais pas quand et où est le meilleur endroit pour cet enregistrement et cette désinscription. Spécialement sur le désenregistrement, car j’ai peur d’avoir des centaines de gestionnaires d’événements de VM sur le modèle pour la VM / vues qui ne sont plus affichés.

Merci d’avance.

Est-ce une nécessité absolue pour vous de limiter la vue non directement liée au modèle?

Vous pouvez exposer le modèle en tant que propriété de la machine virtuelle, puis associer directement votre vue à celui-ci, ce qui évite que la machine virtuelle s’abonne à INPC à partir du modèle.

quelque chose comme:

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

et en xaml (lorsque MyViewModel est le DataContext ):

  

Mettre à jour:

Peut-être que ceci est utile pour exploiter les événements PropertyChanged de Models de manière “faible”

IWeakEventListener

L’utilisation de la dissortingbution d’événements centrale d’un WeakEventManager permet aux gestionnaires des écouteurs d’être collectés (ou purgés manuellement) même si la durée de vie de l’object source s’étend au-delà des écouteurs.

qui est utilisé dans

PropertyObserver de Josh Smith

Cela devrait, espérons-le, résoudre votre problème de nécessité de vous désinscrire explicitement?

J’ai résolu ce problème en me connectant pour modéliser les événements lors du chargement et en les supprimant lors du déchargement. Le problème est que le modèle d’affichage peut manquer des événements s’il est désactivé. Habituellement, je viens d’actualiser rapidement les données au chargement.

OnLoad – Actualise les données de la machine virtuelle à partir des événements de modèle et de liaison. OnUnLoad – supprimez tous les crochets que vous avez mis en place.