2009-05-23 6 views
6

Je n'arrive pas à comprendre comment faire en sorte que le modèle de vue soit averti des changements dans le modèle sans ajouter un tas de choses spécifiques à l'interface utilisateur comme INotifyProperyChanged et INotifyCollectionChanged dans mon modèle ou créer des tonnes d'événements différents et faire un tas de choses Ils ont l'impression qu'ils sont spécifiques à l'interface utilisateur et devraient rester en dehors du modèle.Comment maintenir la logique de vue hors du modèle et de la logique métier hors du modèle de vue dans MVVM?

Sinon, je devrais simplement dupliquer toute la logique métier dans le modèle de vue pour m'assurer que tout est à jour, et alors quel est le point d'avoir le modèle alors?

L'une des plus délicates que j'ai dans mon modèle est une propriété d'une classe "Catégorie". Vous pouvez le considérer comme une structure arborescente et la propriété est l'ensemble des descendants des nœuds. Eh bien dans le modèle que la propriété est générée à la volée récursivement à travers tous ses enfants, ce qui est très bien et bien. Le modèle de vue doit cependant se lier à cette propriété et doit savoir quand il change. Devrais-je simplement changer le modèle pour accommoder le modèle de vue? Si je le fais, alors le modèle de vue ne fait vraiment rien à ce stade, le modèle soulève toutes les notifications de changements nécessaires et la vue peut simplement lier directement au modèle. Aussi, si le modèle était quelque chose dont je n'avais pas la source, comment pourrais-je contourner cela?

Répondre

8

Je ne suis pas d'accord que INotifyPropertyChanged et INotifyCollectionChanged sont spécifiques à l'interface utilisateur. Ils se trouvent dans des espaces de noms et des assemblys qui ne sont liés à aucune pile d'interface utilisateur particulière. Pour cette raison, je place généralement ce type de comportement aussi bas que possible dans le système (généralement la couche de données).

S'il y a une raison pour laquelle vous ne voulez pas le mettre à ce niveau, c'est bien. Vous pouvez le placer à un niveau supérieur, tel que le niveau de service ou d'interface utilisateur. Cependant, vous devez vous assurer que toutes les modifications apportées aux structures de données se produisent également dans cette couche.

+0

En fait INotifyCollectionChanged fait partie de System.Collections.Specialized qui se trouve dans WindowsBase.dll. J'ai toujours trouvé ça bizarre. –

+0

Bon point Cameron. Je trouve cela aussi déconcertant. Mise à jour de ma réponse en conséquence ... –

+0

Hmm, je suppose que la seule fois où j'ai entendu parler d'eux est pour les tutoriels WPF à des fins de liaison de données, mais je suppose qu'il n'y a rien d'autre WPF à part qu'ils sont utilisés pour WPF. – Davy8

Questions connexes