considère que j'ai une application qui gère seulement les messages Je ne peux que travailler avec des messages ou des utilisateurs, donc je ne peux donc pas travailler simultanément avec les deux vues. Par conséquent, j'ai les contrôles Juste pour le rendre un peu plus facile, le modèle code> code> et le modèle utilisateur Maintenant, j'ai les trois mots de vue suivants: p> Le Et il y en a un autre un comme celui-ci qui montrera aux utilisateurs. Maintenant, cela introduit Cette propriété de dépendance est utilisée dans le Il y a Aussi deux boutons de cette fenêtre code> code> qui déclenche les commandes: p> et quand ceux-ci sont tirés, l'UserControl change car Je veux savoir si c'est une mauvaise pratique? strong> Devrais-je ne pas injecter le contrôle de l'utilisateur comme celui-ci? Y a-t-il une autre alternative «meilleure» qui correspond mieux avec le modèle de conception? Ou est-ce une bonne façon d'inclure des vues partielles? P> p> code> et utilisateurs code> je veux que ma fenêtre ait un menu commun code> et une zone où la Courant Affichage code> est affiché.
code> ressemble à ceci: p>
uservievievieviewModel CODE> et le MessagesViewModel CODE> Juste extraire un ObservateurCollection Modèle code> qui est lié dans la vue code> correspondant code> comme ceci: p> MAINWINDOWVIEWMODEL CODE> répond de deux commandes code> différents code> qui ont mis en œuvre icommand code> qui ressemble à quelque chose comme ce qui suit: p> viewModelbase code> qui contient uniquement les éléments suivants: p> mainwindow.xaml code> à affiche le contrôle utilisateur code> dynamicly comme ceci: p>
partielviewModel code> est une propriété de dépendance. P>
4 Réponses :
Vous devez jeter un coup d'œil à prisme . Cela vous donne une manipulation de la région. Je vais également jeter un oeil au MEF pour exporter des vues et sur cette manière, maintenez une extensibilité pour votre projet. p>
Je regarderais à l'aide d'un cadre MVVM telle que caliburn.micro , ce qui rend la composition de la vue incroyablement facile. Si vous avez une propriété sur votre modèle de vue, un type de modèle d'affichage et un Je voudrais également éviter d'utiliser des propriétés de dépendance sur vos modèles d'affichage et mettre en œuvre plutôt inotifypropertychanged . Caliburn.micro est livré avec un type EDIT FORT> P> http://msdn.microsoft.com/en-us/library/ms743695.aspx montre un exemple de mise en œuvre inotifyPropertychangned. p> pour réaliser ce que vous voulez à faire à caliburn.micro, vous feriez quelque chose comme ce qui suit (un exemple brut, mais cela vous montre à quel point il est facile de faire la composition de la vue à l'aide d'un framework MVVM): p> pour appeler le Donc, votre MainView.xaml peut ressembler à: p> contentControl code> sur votre vue qui est nommé identique que votre propriété, caliburn.micro localisera que la vue de la vue correspondante via Conventions, faites la liaison pour vous automatiquement et injecte la vue dans le ContentControl code>. PropertyChangedBase CODE> Type qui implémente cette interface et fournit également une méthode d'aide à l'invocation de l'événement code> de la propriété code> à l'aide d'expressions Lambda plutôt que de cordes magiques (ce qui est bien meilleur Pour refactoring ultérieurement). P> usersviewModel code> et MessagesViewModel code> irait de Écran code>. P> Voir les afficheurs code> ou showMessages code> verbes avec caliburn.micro, il vous suffit de créer des commandes de vue avec le même nom. Le type de conducteur a une propriété code> ActiveItem CODE> qui est l'élément actuellement conducté. Vous pouvez donc ajouter un contentcontrol code> à votre mainview.xaml qui est nommé actifItem code> et caliburn.micro s'occupera d'injecter la bonne vue. P>
Pourriez-vous ajouter un exemple de la façon dont vous utiliseriez inotifyProperTychanged à la place si les propriétés de dépendance?
Ce n'est pas une mauvaise approche à première vue, il pourrait s'agir simplement d'utiliser dans une petite application. P>
Cependant, il y a quelques choses qui ne sont pas si gentilles: p>
dépendencycyObject code> pour avoir un dépendanceProperty code>. Dans le monde réel, j'ai constaté que c'est très énervant de devoir traiter des images de vue de manière unique (il y a beaucoup d'opérations asynchrones que l'on pourrait vouloir jouer). Li>
- ça n'a pas échoué; Changer la mise en page nécessitera des quantités importantes de travail. LI>
ol>
Un cadre MVVM décent rend la composition de l'UI facile en fournissant une infrastructure pour composer des sous-vues dans votre vue principale. Dans le prisme (qui est ma préférence personnelle), cela se produit avec régions code> . p>
Pourquoi ne pas utiliser de contenuPresenter / contentControl avec un fichier de données dans votre MainWindow?
au lieu de Usercontrol Content = "{Binding PartialViewModel}" />, vous pouvez utiliser un: P>
private DelegateCommand _showMessageCommand;
public ICommand ShowMessageCommand
{
get
{
return this._showMessageCommand ?? (this._showMessageCommand = new DelegateCommand(this.ShowMessageExecute, this.CanShowMessageExecute));
}
}
Au fait, tout problème utilisant cette approche à la place? Quels seraient les avantages d'utiliser un cadre MVVM à la place?
Vous pouvez utiliser n'importe quel framework MVVM et cette solution ou vous pouvez utiliser n'importe quel cadre MVVM et non cette solution;) Cela ne dépend pas l'un de l'autre. Il y a quelques solutions comment vous obtenez votre viewModel à votre avis et inversement. Celui-ci est un simple WPF construit