Wpf UserControl et MVVM
Je pense à propos de l'écriture d'un Contrôle Utilisateur WPF pour mon application. Je suis en utilisant MVVM dans mon application.
De contrôle de l'utilisateur peuvent avoir besoin de Dépendance des Propriétés qui peuvent être définies ma Vue Parent. lors de l'utilisation de MVVM, l'idée est que la Vue Parent finira par créer une liaison entre le UserControls
DP avec Vue Parent VM)
Dependency Properties
doivent être créés dans la classe Vue comme une machine virtuelle n'héritent pas de DependencyObject
. Cela signifie l'ajout de code dans le code XAML derrière.
Je me demandais si vous pouvez donner des conseils quant à la façon dont je dois concevoir un contrôle de l'utilisateur lors du développement d'application WPF utilisant MVVM...
Vous devez vous connecter pour publier un commentaire.
Cas 1: Si vous êtes à la création de ce contrôle juste pour être consommée dans votre application, alors vous pouvez aller de l'avant et de créer un
ViewModel
pour elle, mais alors, vous n'avez pas besoin de créer de DP, votreViewModel
pouvez simplement mettre en œuvreINotifyPropertyChanged
et votre parent Vm peut encore se lier à eux.Dans notre cas, pour l'utilisateur, les contrôles, nous avons créé séparé VM et une instance de il était présent dans
ParentVM
. Donc vue parent aura ce contrôle et lient l'UserControlVM
à ce contrôle(ParentVM.UserControlVM
) et usercontrol va prendre soin des autres liaisons.Cas 2: Si votre contrôle sera utilisé par d'autres applications ou des développeurs et vous ne voulez pas le garder simple, puis aller de l'avant avec la création de contrôles personnalisés suivant modèle de contrôle de la mise en œuvre. De cette façon, vous pouvez créer look, à moins de contrôles et d'utiliser
dependency properties
trop. En outre, quiconque utilise que le contrôle n'a pas besoin de connaître sur le modèle de vue et de l'utiliser.Certaines des questions similaires/messages:
Un
UserControl
fait partie de la "Vue" dans "MVVM" tout comme lesTextBox
ouListView
contrôles sont une partie de la Vue.Si vous décidez d'utiliser MVVM pour développer votre
UserControl
lui-même ou de l'écrire dans QBASIC (non recommandé) il ne rompt pas le pattern MVVM pour les consommateurs de vosUserControl
aussi longtemps qu'ils peuvent faire tout ce dont ils ont besoin avec votreUserControl
en se liant àDependencyProperty
's exposées sur votreUserControl
. c'est à dire VotreUserControl
devrait exposer les propriétés qu'il est dépendante sur (d'où le nom). Une fois que vous saisissez ceDependencyProperty
's coup faire tout un tas de sens et que vous voulez leur utile pour changer les gestionnaires d'événements et les valeurs par défaut que vous spécifiez dans leur constructeur.Si votre
UserControl
est dans une autre assemblée ou pas je ne vois pas en quoi cela fait une différence.Que dit à plusieurs chercheraient à vous de construire votre
UserControl
en utilisant le pattern MVVM lui-même pour toutes les bonnes raisons MVVM apporte par exemple, aider un autre développeur de regarder votre code. Cependant, certaines choses sont tout simplement pas possible et/ou beaucoup plus difficile, plus complexe et moins performant à bidouiller le code XAML pour ce faire - je ne parle pas de votre variété de jardin Formulaire d'Ajout d'Utilisateur, mais par exemple unUserControl
de la manipulation de la mise en page de milliers de visuels. En outre, puisque vous travaillez dans votre point de Vue vous ne PAS voulez que votreUserControl
's Viewmodel mélangé avec vous des applications!Fondamentalement, je suis en train de dire qu'il est bien dans MVVM de ne pas utiliser MVVM sur votre point de Vue!
UserControl
séparé (+1).En gros, au lieu de lier votre UserControl datacontext de la userControlViewModel, il est préférable de le faire sur le premier élément enfant de l'utilisateur contrôle. De cette façon, toutes les références que vous faites dans le contrôle est lié à la userControlViewModel, mais les dépendances des propriétés peuvent être définies à partir des données de contexte où vous souhaitez utiliser votre UserControl.
Ce modèle a très bien fonctionné pour moi, sur votre UserControl XAML:
Puis sur le code-behind: