Mieux PropertyChanged et PropertyChanging la gestion des événements
Je mets en place le pattern observer pour notre application en cours de lecture autour de avec la RX-Cadre.
J'ai actuellement un exemple qui ressemble à ceci:
Observable.FromEventPattern<PropertyChangedEventArgs>(Instance.Address, "PropertyChanged")
.Where(e => e.EventArgs.PropertyName == "City")
.ObserveOn(Scheduler.ThreadPool)
.Subscribe(search => OnNewSearch(search.EventArgs));
(J'en ai un similaire pour "PropertyChanging")
EventArgs ne me donne pas beaucoup. Ce que je voudrais, c'est une extension de la EventArgs qui me donnerait la possibilité de voir les anciennes et les nouvelles valeurs, ainsi que la capacité à marquer l'événement en train de "changer" de l'auditeur, tels que le changement ne fait pas persister. Comment cela peut-il être fait? Merci.
Voir ceci
OriginalL'auteur user981225 | 2011-12-20
Vous devez vous connecter pour publier un commentaire.
Je pense que cela vient de la façon dont vous mettez en œuvre l'INotifyPropertyChanging et INotifyPropertyChanged interfaces.
La PropertyChangingEventArgs et PropertyChangedEventArgs classes, malheureusement, ne fournit pas un avant et un après de la valeur de la propriété ou de la possibilité d'annuler le changement, mais vous pouvez profiter de votre propre événement args classes qui fournissent cette fonctionnalité.
Tout d'abord, définir l'événement suivant args classes. Notez que ces derniers sont issus de la PropertyChangingEventArgs classe et PropertyChangedEventArgs classe. Cela nous permet de nous passer de ces objets comme arguments à la PropertyChangingEventHandler et PropertyChangedEventHandler délégués.
Ensuite, vous devez utiliser ces classes dans votre mise en œuvre de la INotifyPropertyChanging et INotifyPropertyChanged interfaces. Un exemple de mise en œuvre est la suivante:
Remarque, les gestionnaires d'événements pour les PropertyChanging et PropertyChanged événements auront encore besoin de prendre l'original PropertyChangingEventArgs classe et PropertyChangedEventArgs classe en tant que paramètres, plutôt qu'une version spécifique. Cependant, vous devrez être en mesure de lancer l'événement args objets plus spécifiques pour accéder à les nouvelles propriétés.
Ci-dessous est un exemple des gestionnaires d'événements pour les événements suivants:
Serait-il possible de mettre en œuvre ce à l'aide d'un DynamicProxy, afin d'éviter que le code dans le setter?
Je ne suis pas familier avec DynamicProxy (comme dans Château?), mais je suppose que vous dire de prendre une AOP ou d'une politique d'injection de l'approche. Je suis d'accord avec votre ligne de la pensée et je serait certainement chercher un mécanisme (AOP, de la politique de l'injection, ou autre) afin de consolider la propriété de poseur de code, de sorte que vous n'avez pas beaucoup de code redondant. Je n'ai pas de mécanisme particulier pour recommander désinvolte, si.
Merci beaucoup pour votre aide, il est apprécié. Si je peux trouver une élégante solution Proxy je vais le poster ici.
Cette information est utile, mais je suis ... comme d'habitude ... gêné par le fait que les abonnés aux Événements doivent exprimer la Propriété spécifique Changé et l'Évolution des événements à la Coutume des Arguments de Type afin de pouvoir accéder à l'intérieur des champs. Je pense qu'il devrait y avoir une façon de faire qui ne nécessite pas le casting, mais je ne le trouve pas.
OriginalL'auteur Dr. Wily's Apprentice
La réponse est vraiment mauvais, vous pouvez le faire simplement avec de la mémoire Tampon().
OriginalL'auteur Nicolas Dorier
Pour ceux qui ne veulent le meilleur des deux RX et d'être en mesure d'Annuler ici est un hybride de ces deux idées
Le ViewModel de la classe de base des trucs
Puis j'ai ces quelques extensions.
Un pour obtenir le nom de la propriété à partir de l'Expression de l'arbre
Et puis la partie Rx
Puis exemple d'utilisation sera comme ceci
Fonctionne un régal
OriginalL'auteur sacha