2010-10-14 8 views
16

J'essaie de trouver la meilleure façon de faire exploser les événements PropertyChanged des propriétés imbriquées dans mon ModelView. Dire que j'ai mon ModelView PersonModelView qui a une propriété PersonModelView.Address. Address à son tour a une propriété City. Quand je me lie à City à mon avis, je ferais quelque chose comme {Binding Address.City}.Quel est un bon moyen de générer des événements INotifyPropertyChanged à travers les propriétés de ViewModel avec MVVM?

Mon problème est que même si Address implémente INotifyPropertyChanged, la liaison ne sera pas mis à jour car il gère PropertyChanged sur le PersonModelView, pasAddress. Je crois avoir deux options: (1) changer la source de la liaison (ou changer le DataContext) à la propriété Address ou (2) ont la PersonModelView poignée PropertyChanged sur l'objet Address et Refire son propre PropertyChanged avec quelque chose comme Address.City.

Comment allez-vous résoudre ce problème? (J'utilise MVVM light toolkit au mo, mais je suis intéressé par toutes les approches)

Répondre

8

Si Address implémente INotifyPropertyChanged et soulève correctement PropertyChanged événements sur sa propriété City alors la liaison doit remarquer que la propriété il est lié à a changé.

+0

J'accepte. Je n'ai jamais eu à propager des événements quand un champ d'un niveau ou deux vers le bas a été lié. Essayez de déclencher 'PropertyChanged' avec' null' comme nom de propriété et placez un point d'arrêt dans le setter de votre propriété pour vous assurer que la liaison fonctionne (ou vérifiez la fenêtre de sortie). –

+0

C'est un vrai soulagement, ça devrait rendre mon code beaucoup plus agréable. Je suppose que je dois avoir fait une erreur quand j'ai essayé pour la première fois, je l'ai fait à nouveau dans une nouvelle solution et ça fonctionne très bien. Merci pour l'aide les gars! – Geoff

1

Votre objet Address met-il en œuvre INotifyPropertyChanged? Sinon, je pense que cela réglerait le problème que vous voyez.

Editer: Désolé, juste remarqué que vous avez mentionné dans votre message que vous avez déjà essayé. Avez-vous essayé de vous abonner à l'événement PropertyChanged de l'objet Address dans votre PersonViewModel? OnChanged, vous pouvez effectuer un PropertyChanged sur votre objet Address.

+0

Oui il le fait. Donc, la liaison doit-elle gérer l'événement PropertyChanged sur PersonModelView ou Address si la liaison est {Binding Address.City}? (et le PersonModelView est le DataContext bien sûr) – Geoff

+0

Pourriez-vous poster votre code? Il me semble que la façon dont vous l'avez mis en place devrait fonctionner. Avez-vous regardé votre fenêtre 'Sortie' pour vous assurer que la liaison est correcte? – JSprang

3

est ici un fil SO contenant une solution sur la façon de bouillonner ces notifications: When nesting properties that implement INotifyPropertyChanged must the parent object propogate changes?

Cependant, IIRC WPF a l'intelligence de surveiller automatiquement une adresse pour les notifications INotifyPropertyChanged lors de la liaison de contrôle est réglé sur Address.City sans PersonViewModel ayant besoin de re-diffuser les notifications de mise à jour de l'objet Adresse.

+0

Ben, vouliez-vous revenir à cette question? –

+0

Euh, je pense que c'est le mauvais lien;) Bon, j'ai dû manquer quelque chose. Je pensais que les fixations ne pouvaient pas gérer ça, retour au code pour moi! – Geoff

+0

Oups! Merci d'avoir attrapé ça. Lien corrigé –