Question

Je viens de commencer à expérimenter avec Laurent Bugnion MVVM Lumière Toolkit . Je pense que je vais vraiment comme ça, mais j'ai quelques questions.

Avant de les trouver, laissez-moi vous expliquer où je viens. J'utilise actuellement une combinaison de MVVM Fondation et un autre projet sur CodePlex appelé MVVM Toolkit . J'utilise ObservableObject et Messenger de MVVM Fondation et DelegateCommand et CommandReference de MVVM Toolkit.

Le seul chevauchement réel entre MVVM Fondation et MVVM Tookit est qu'ils ont tous deux une mise en œuvre ICommand: MVVM Fondation a RelayCommand et MVVM Tookit a DelegateCommand. De ces deux, DelegateCommand semble être plus sophistiqué. Elle emploie une CommandManagerHelper qui utilise des références faibles pour éviter les fuites de mémoire.

Cela dit, voici mes questions:

  1. Pourquoi MVVM utiliser la lumière RelayCommand plutôt que DelegateCommand? L'utilisation de références faibles dans une ICommand inutile ou non recommandé pour une raison quelconque?

  2. Pourquoi est-il pas ObservableObject dans MVVM Light? ObservableObject est fondamentalement juste la partie de ViewModelBase qui implémente INotifyPropertyChanged, mais il est très pratique d'avoir une classe séparée, car vue-modèles ne sont pas les seuls objets qui ont besoin de mettre en œuvre INotifyPropertyChanged. Par exemple, supposons que vous avez un DataGrid qui se lie à une liste d'objets Person. Si l'une des propriétés en Person peut changer pendant que l'utilisateur visualise l'DataGrid, Person aurait besoin de mettre en œuvre INotifyPropertyChanged. (Je me rends compte que si Person est généré automatiquement en utilisant quelque chose comme LinqToSql, il mettra en œuvre probablement déjà INotifyPropertyChanged, mais il y a des cas où je dois faire des versions vue spécifiques des objets de modèle d'entité, par exemple, parce que je dois inclure une commande soutenir une colonne de bouton dans une grille de données.)

Merci.

P.S. Voici le code pour DelegateCommand de la boîte à outils MVVM:

https://docs.google.com/document/pub?id=1ApCx5SbCfHi5fBhv8Ki3zA6j34sp2t80LQZdj89v8cU

Était-ce utile?

La solution

Il semble que la question soulevée par la première question a été résolu dans la dernière version:

Selon Le site Codeplex Light Toolkit MVVM (sous "l'événement est CanExecuteChanged manuellement"), le CommandManager a été complètement éliminé.

En ce qui concerne Observable Object, j'ai ajouté un élément à la question Tracker sur le site Codeplex.

Autres conseils

Vous pouvez également envisager Catel . Il prend en charge un DataObject (à la fois génériques et non générique) que le soutien exactement ce que vous cherchez (un objet implémentant INotifyPropertyChanged, IDataErrorInfo, et bien plus encore). Ensuite, le ViewModelBase est dérivé de la classe DataObjectBase très puissante, de sorte que vous pouvez utiliser le DataObjectBase pour les objets de données, et la ViewModelBase pour les modèles de vue.

Il vous permet aussi de créer des messagers puisque vous pouvez simplement utiliser l'attribut InterestedIn sur un modèle en vue de recevoir des notifications de changement d'un autre modèle de vue.

vos deux questions me portent à croire fermement que vous préférez utiliser quelque chose plus que le concept Voir modèle pour définir la logique métier.

Le DelegateCommand définit une séparés classe en dehors de la vue Modèle. Le ObservableObject est une instance de séparés classe en dehors de la vue Modèle. Ce n'est pas une règle, mais la préférence personnelle du moment: la vue Modèle me suffit en tant que conteneur pour la logique métier, relative aux visuels. Cela peut trahir ma préférence pour MVVM Lumière --- que je ne trouve pas manquer le moment.

Je ne suis pas tout à fait certain de ce qui se passe dans l'exemple DataGrid. Ce que je peux dire est que le DataGrid n'est pas très flexible --- cependant, WPF, le DataGridTemplateColumn peut déclarative lier un modèle Voir à une vue (par exemple un contrôle utilisateur). Alors peut-être ce sens de marques:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate DataView="{x:Type m:YourViewModelForButton}">
        <v:YourViewWithButton/>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top