7
votes

Y compris des vues partielles lors de l'application du modèle de conception de mode de vue mode-ViewModel

considère que j'ai une application qui gère seulement les messages et utilisateurs je veux que ma fenêtre ait un menu commun et une zone où la Courant Affichage est affiché.

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

  • MessageView.xaml
  • userview.xaml

    Juste pour le rendre un peu plus facile, le modèle et le modèle utilisateur ressemble à ceci:

    • Nom
    • Description

      Maintenant, j'ai les trois mots de vue suivants:

      • MainWindowviewModel
      • UtilisateursviewModel
      • MessagesviewModel

        Le uservievievieviewModel et le MessagesViewModel Juste extraire un ObservateurCollection de son Modèle qui est lié dans la vue correspondant comme ceci:

        < p> Le MAINWINDOWVIEWMODEL répond de deux commandes différents qui ont mis en œuvre icommand qui ressemble à quelque chose comme ce qui suit: xxx < / Pré>

        Et il y en a un autre un comme celui-ci qui montrera aux utilisateurs. Maintenant, cela introduit viewModelbase qui contient uniquement les éléments suivants: xxx

        Cette propriété de dépendance est utilisée dans le mainwindow.xaml à affiche le contrôle utilisateur dynamicly comme ceci:

        Il y a Aussi deux boutons de cette fenêtre qui déclenche les commandes:

        • ShowMessagesCommerci
        • showuserscommand

          et quand ceux-ci sont tirés, l'UserControl change car partielviewModel est une propriété de dépendance.

          Je veux savoir si c'est une mauvaise pratique? 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?


0 commentaires

4 Réponses :


0
votes

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.


0 commentaires

1
votes

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 contentControl 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 .

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 PropertyChangedBase Type qui implémente cette interface et fournit également une méthode d'aide à l'invocation de l'événement de la propriété à l'aide d'expressions Lambda plutôt que de cordes magiques (ce qui est bien meilleur Pour refactoring ultérieurement).

EDIT

http://msdn.microsoft.com/en-us/library/ms743695.aspx montre un exemple de mise en œuvre inotifyPropertychangned.

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): xxx > Notez que usersviewModel et MessagesViewModel irait de Écran .

pour appeler le Voir les afficheurs ou showMessages 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é ActiveItem qui est l'élément actuellement conducté. Vous pouvez donc ajouter un contentcontrol à votre mainview.xaml qui est nommé actifItem et caliburn.micro s'occupera d'injecter la bonne vue.

Donc, votre MainView.xaml peut ressembler à: xxx


1 commentaires

Pourriez-vous ajouter un exemple de la façon dont vous utiliseriez inotifyProperTychanged à la place si les propriétés de dépendance?



2
votes

Ce n'est pas une mauvaise approche à première vue, il pourrait s'agir simplement d'utiliser dans une petite application.

Cependant, il y a quelques choses qui ne sont pas si gentilles:

  1. ViewModelBase doit être un dépendencycyObject pour avoir un dépendanceProperty . 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).
  2. ça n'a pas échoué; Changer la mise en page nécessitera des quantités importantes de travail.

    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 .


0 commentaires

2
votes

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));
        }
    }


2 commentaires

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