J'ai un problème assez simple (j'espère :)) :
Dans MVVM, View écoute généralement les modifications des propriétés de ViewModel. Cependant, j'aimerais parfois écouter les événements, de sorte que, par exemple, View puisse lancer l'animation ou fermer la fenêtre, lorsque VM le signale.
Il est possible de le faire via une propriété bool avec NotifyPropertyChanged (et de ne lancer l'animation que lorsqu'elle passe de false à true), mais cela ressemble à un hack, je préférerais de loin exposer l'événement, car c'est sémantiquement correct.
Aussi, j'aimerais le faire sans code dans le codebehind, comme faire viewModel.myEvent += handler
cela signifierait que je devrais manuellement désenregistrer l'événement afin de permettre à la vue d'être GC'd - les vues WPF sont déjà en mesure d'écouter sur les propriétés "faiblement", et je préfère de loin programmer uniquement de manière déclarative dans la vue.
L'abonnement standard aux événements forts est également mauvais, car je dois changer plusieurs ViewModels pour une seule vue (parce que créer une vue à chaque fois prend trop de temps au CPU).
Merci pour les idées (s'il existe une solution standard, un lien vers msdn suffira) !
1 votes
Propertychanged est un événement. Qu'est-ce qui n'est pas sémantiquement correct dans l'écoute d'une propriété bool dans un trigger ?
11 votes
Je ne comprends vraiment pas pourquoi les gens sont si opposés au codebehind dans la vue. La raison pour laquelle les vues répondent aux propriétés est due au code dans le codebehind, il est juste caché dans le cadre.
2 votes
Adrianm : J'ai essayé de créer une propriété bool dans VM qui est toujours fausse, et de lever OnPropertyChanged sur elle, mais la vue n'a pas réagi - il semble que WPF fera quelque chose seulement quand la valeur réelle change. J'aurais donc besoin d'activer et de désactiver ce bool, MyProp = true ; OnPropertyChanged("MyProp") ; MyProp = false ; OnPropertyChanged("MyProp") ; - au lieu de RaiseMyEvent(). Vous voyez ?
5 votes
Cameron : Parce que souscrire à un événement dans la vue est un couplage fort, et le faire faiblement pour ne pas causer de fuites de mémoire est vraiment délicat. De plus, nous utilisons parfois plusieurs vues pendant le développement (pour essayer des approches alternatives à l'interface graphique), et garder leurs codes synchronisés serait une charge de maintenance inutile. Il est également possible de tester la vue en assignant un type anonyme avec des données d'échantillon, ce qui serait beaucoup plus difficile avec un code source fortement typé.
1 votes
J'utilise le principe selon lequel la VM a connaissance de la vue via une interface IView. Je résoudrais le problème avec une méthode dans l'interface qui démarre l'animation.