Dans le modèle MVVM, le modèle doit-il implémenter l’interface INotifyPropertyChanged?

J’ai une idée claire sur View et ViewModel dans le pattern MVVM. Je prévois d’implémenter le pattern MVVM dans mon application. Je suis confronté à un problème concernant le modèle. J’ai un fichier .xml qui est analysé et les informations sont affichées dans la vue.

Je dois être informé des modifications apscopes au modèle pour la première fois seulement. A partir de la demande, je dois être averti.

Alors, comment mettre en œuvre le modèle?

Dois-je également implémenter l’interface INotifyPropertyChanged dans la classe de modèle? (J’ai lu que le modèle ne doit pas implémenter l’interface INotifyPropertyChanged , car il est spécifique à WPF)

Implémenter INotifyPropertyChanged dans les modèles est totalement acceptable –

En règle générale, le modèle implémente les fonctionnalités qui facilitent la liaison à la vue. Cela signifie généralement qu’il prend en charge les notifications de propriété et de collection modifiées via les interfaces INotifyPropertyChanged et INotifyCollectionChanged . Les classes de modèles qui représentent des collections d’objects dérivent généralement de la classe ObservableCollection , qui fournit une implémentation de l’interface INotifyCollectionChanged .

Bien que ce soit à vous de décider si vous voulez ou non ce type d’implémentation, mais souvenez-vous –

Que faire si vos classes de modèle n’implémentent pas les interfaces requirejses?

Vous devrez parfois travailler avec des objects de modèle qui INotifyPropertyChanged pas les INotifyPropertyChanged , INotifyCollectionChanged , IDataErrorInfo ou INotifyDataErrorInfo . Dans ces cas, le modèle de vue peut devoir envelopper les objects du modèle et exposer les propriétés requirejses à la vue. Les valeurs de ces propriétés seront fournies directement par les objects du modèle. Le modèle de vue implémentera les interfaces requirejses pour les propriétés exposées afin que la vue puisse facilement les lier à des données.

Tiré de – http://msdn.microsoft.com/en-us/library/gg405484(PandP.40).aspx

J’ai travaillé sur certains projets où nous n’avions pas implémenté INotifyPropertyChanged dans nos modèles et pour cette raison, nous avons rencontré beaucoup de problèmes. Une duplication inutile des propriétés était nécessaire dans VM et nous devions en même temps mettre à jour l’object sous-jacent (avec les valeurs mises à jour) avant de les transmettre à BL / DL.

Vous rencontrerez des problèmes en particulier si vous avez besoin de travailler avec la collection d’objects de votre modèle (par exemple dans une grid ou une liste modifiable) ou des modèles complexes; Les objects de modèle ne seront pas mis à jour automatiquement et vous devrez gérer tout cela dans votre VM.

L’approche MVVM standard consiste à implémenter INotifyPropertyChanged uniquement sur ViewModel. L’objective est d’actualiser les liaisons appropriées dans la vue lorsque quelque chose change dans ViewModel.

Cependant, cela cible les modifications apscopes au ViewModel par la vue . C’est-à-dire que lorsque vous modifiez la valeur dans un TextBox , l’implémentation INotifyPropertyChanged sur le ViewModel actualisera les liaisons associées, afin que la vue soit correctement mise à jour.

Il ne couvre pas les modifications apscopes au modèle par une source externe, telles que les modifications de firebase database ou une autre interface. Tant que toutes les modifications de données proviennent de la vue, ViewModel doit être au courant de toutes les modifications et savoir quoi mettre à jour. Par exemple, si vous savez que modifier la variable Foo sur votre modèle modifiera également la valeur de Bar sur votre modèle, il serait judicieux d’appeler OnPropertyChanged(Foo) et OnPropertyChanged(Bar) dans votre ViewModel lorsque vous modifiez la valeur de Foo .

L’autre alternative consiste à utiliser des événements entre le modèle et ViewModel pour actualiser les valeurs du ViewModel qui nécessitent une mise à jour. Si, comme vous le dites, la notification est requirejse “première fois uniquement”, alors la mise en œuvre d’un manuel une fois la mise à jour désactivée sur certains déclencheurs devrait également fonctionner.

C’est un problème très courant lorsque vous travaillez avec MVVM, INotifyPropertyChanged n’est pas spécifique à WPF car il fait partie de System.ComponentModel , vous n’avez donc pas besoin d’append de référence spécifique à WPF dans votre solution.

Si vous implémentez INofityPropertyChanged dans votre modèle, vous pouvez économiser beaucoup plus de code dans ViewModel (Propriétés du proxy). Il est donc acceptable que Model ait INotifyPropertyChanged .

Parfois, il est acceptable que le modèle implémente l’interface INotifyPropertyChanged .

Par exemple, si le modèle a beaucoup de propriétés à visualiser et que vous souhaitez éviter d’implémenter beaucoup de code (propriétés proxy) dans le modèle de vue pour exposer ces propriétés de modèle.

Regardez http://msdn.microsoft.com/en-us/magazine/ff798279.aspx

C’est un argument classique entre les codeurs “purs” MVVM et les autres.

J’ai tendance à lire les livres chaque fois que je le peux parce que la plupart du temps, cela a du sens. Cependant, dans certains scénarios, l’improvisation du code en fonction des besoins réduit beaucoup le code en double.

Dans votre cas, vous pouvez lire le code XML dans une classe de modèle et en faire une copie dans le modèle de vue ou copier les propriétés souhaitées du modèle dans le modèle de vue. De cette façon, vous avez le contrôle de la mise à jour de l’interface utilisateur / du modèle. Si vous suivez la première approche, Inotifyproperty doit être implémenté dans votre classe de modèle et cela est acceptable.

Cela dit, je ferais de mon mieux pour suivre la deuxième approche, car cela me donnerait un contrôle précis sur toutes les propriétés affichées / manipulées dans la vue. En outre, je me sentirai beaucoup mieux que je ne brise pas le modèle MVVM.

Je ne suis pas sûr de ce que tu veux dire. Dans la VM, vous pouvez avoir soit INotifyPropertyChanged , soit DependencyProperty-es (dans ce cas, la VM doit dériver de DependencyObject ). Cela n’a aucun sens d’avoir les deux. Cela n’a pas non plus de sens de n’en avoir aucun.

Dans le modèle, vous pouvez faire ce que vous voulez. La capacité de tirer / recevoir des événements est bonne, mais vous ne pouvez pas toujours compter sur eux. Fondamentalement, le modèle dépend des données source et des éléments associés, tandis que viewModel a la charge d’interface du modèle avec la couche de présentation. Puisque WPF fonctionne sur les événements, au moins la machine virtuelle doit fournir un mécanisme de notification.