8
votes

Je ne reçois toujours pas mvvm!

Peut-être que j'ai fait du développement flexible avec des cadres tels que Cairngorm trop longtemps, mais je ne reçois toujours pas MVVM. Je suis conscient que Cairngorm est un cadre et MVVM est un modèle de conception, mais ce que je comparais ici est la mise en œuvre des Cairngorms des modèles de conception, principalement le contrôleur de vue du modèle et le modèle de commande. Ne vous méprenez pas, je pense que l'idée de lier la vision d'un modèle d'affichage est excellente et les avantages de la testabilité et du flux de travail des concepteurs-programmeur sont excellents. Mais il y a deux choses qui me dérangent: on programmait toutes mes actions avec des commandes, ce qui m'a également bordé de Cairngorm. Ce n'est qu'à Cairngorm La façon dont ils ont mis en œuvre le modèle de commande vous avaient bénéficié d'un contrôleur centralisé pour toutes vos commandes, que vous ne semblez pas obtenir avec MVVM, à moins que je ne manque quelque chose. Et si je pensais que la mise en œuvre des commandes à Cairngorm a été compliquée dans le MVVM est beaucoup pire, je veux dire avoir à créer des classes privées qui mettent en œuvre ICommand pour tout ce que je fais semble trop. Et puis vous avez le problème que tous les contrôles ne mettent pas tous les commandes d'implémentation, donc par exemple si vous utilisez une liste de liste, que j'utilise beaucoup, vous n'avez pas de chance; Il y a des solutions de contournement mais toutes sortes de complotées.

L'autre chose qui me dérange est la communication entre les modèles de vue. Dans un contrôleur de vue de modèle standard, vous collectez toutes vos informations sur un modèle centralisé observé par les vues, mais cela ne semble pas être le cas avec MVVM, du moins pas dans les exemples que j'ai vus. Ainsi, par exemple, si vous avez un contrôle avec une liste que vous utilisez pour sélectionner un élément qui est ensuite utilisé comme source pour différentes vues et des actions conséquentes, ce n'est pas clair pour moi comment vous informez tout le monde des modifications sans modèle centralisé.

Je suis au courant de MVVMFoundation et du travail de Tom Ershamam sur les commandes WPF partout. M'a appelé démodé, mais je pense que pour vraiment comprendre un modèle, vous devez construire une application qui l'utilise à partir de zéro. C'est ce que je fais ce que je fais, mais tout le temps je continue à penser que je dois manquer quelque chose d'essentiel parce que je ne semble pas pouvoir me calmer cette petite voix dans ma tête qui ne me dise que de me dire qu'il doit y avoir une meilleure façon.


2 commentaires

Peut-être que vous pourriez formuler vos plaintes / doutes dans une question?


La question serait de me manquer quelque chose concernant le MVVM ou y a-t-il une meilleure façon?


5 Réponses :


3
votes

Eh bien écrire une nouvelle commande que les impugnants iCommand semble un peu plus chuté de tuer un coup d'œil à cette classe: Vb.net: Relais de classe publiqueCommand Implexment ICommand

private ICommand mDeleteCommand;
public ICommand DeleteCommand {
    get {
        if ((mDeleteCommand == null)) {
            mDeleteCommand = new RelayCommand(CanDeleteTodo, DeleteTodo);
        }
        return mDeleteCommand;
    }
}


3 commentaires

Merci beaucoup, j'ai vu ce code sur l'excellent article de Josh Smith et est bien utile, mais il laisse toujours la question ouverte sur la raison pour laquelle nous devons toujours utiliser des commandes toujours? Les événements sont-ils dans le code derrière le mal intrinsèquement ou y a-t-il des circonstances quand ils sont justifiés?


Im loin d'un expert, mais j'essaie de garder mon code de vue à vide si je peux, à ce que je sache que vous ne pouvez pas créer de banquets à un événement afin que cela vous laisse avec des commandes .. (et je dois dire à un La vue pure xaml est belle que vous devez juste regarder dans un endroit)


Le code derrière n'est pas la viewModel. Le moyen le plus simple d'avoir la vue d'exécution de code dans la vue ViewModel consiste à lier une commande à l'objet GUI. Les gestionnaires d'événements dans le code derrière peuvent appeler la viewmodel, mais si vous utilisez une liaison, vous coupez le MINDLEMANIER.



3
votes

Quel que soit le cadre / l'architecture / motif, vous aurez toujours besoin de quelque chose qui répond à un bouton Cliquez sur une barre d'outils / Menu ou simple. Et vous avez besoin de quelque chose qui dit si le bouton / menu doit être activé. Donc, l'interface ICommand est agréable pour cela. Je suis d'accord avec Petoj, vous n'avez pas besoin d'une nouvelle classe. J'ai écrit une simple implémentation qui prend 1 ou 2 délégués, une pour la réponse réelle au clic (méthode d'exécution) et une option optionnelle pour l'état "Activé" de la commande. De cette façon, le point de vue n'est pas encombré.

Mais je conviens que ce n'est pas un référentiel centralisé de commandes. Mais en veux-tu vraiment un? Je préfère avoir des commandes spécifiques à une partie d'une application dans le modèle de visualisation correspondante, avec des événements appropriés soulevés lorsque le reste de l'application doit être notifié.

Pour la liste de liste, je lie la propriété sélectionnée sur une propriété sur la vue de la vue. Avec InotifyPropertyChanged, toute partie de votre code peut réagir au changement.

La communication entre ViewModels est une bonne question. Si vous avez besoin de vues différentes sur le même écran, vous pouvez avoir un modèle de vision «super» contenant le modèle de vue de chaque vue. Il y a plusieurs frameworks MVVM là-bas. J'ai utilisé des pièces de Mark Smith's MVVM Helpers , qui est assez léger et utile.


0 commentaires

0
votes

OK afin de donner à ce fil une sorte de fermeture pour la référence future. D'abord merci beaucoup pour les réponses. Le relaisCommand est vraiment une bonne idée; Il rationalise vraiment les choses beaucoup et rend la chose facile à tester et à travailler avec. On dirait que c'est la voie à suivre. La liaison au SEXEYITEM semble également résoudre le problème de l'absence de prise en charge de la commande dans les itemsControl. En ce qui concerne la communication entre ViewModels, je ne suis pas convaincu qu'avoir un modèle de super vue résout mon problème, car il tient le modèle à mon arbre visuel. En outre, je n'ai pas trouvé de manière dans cette structure pour avoir un moyen de communiquer entre tous les modèles d'affichage dans différentes hiérarchies. Donc, ce que j'essaie d'essayer, c'est d'abord créer un modèle centralisé qui est un singleton qui implémente l'interface inotifypropertychanged. Les images de vue peuvent alors avoir une instance de ce modèle et agir sur elle propager les changements de propriété correspondants à l'aide de notre bon vieil ami le modèle d'observateur. Semble fonctionner correctement, même si je suis un peu inquiet des références circulaires. Que pensez-vous?


0 commentaires

1
votes

Helo Julio,

On dirait que c'est un ancien poste, mais j'aime vraiment votre question.

Récemment, je suis un programmeur Flex et un WPF aussi. Je savais que Cairngorm (disons [c]) Cadre-cadre, j'ai appris à utiliser Modèle de présentation Utilisation de Parsley Framework, et dans WPF, je me rends compte que le modèle de présentation a été changé en motif MVVM.

commande

commande dans [c] est différent de celui de MVVM, la commande dans [C] est plus satisfaite en tant que Modèle de commande , où dans [C] contrôleur agir comme Invoker , donc dans [c] la commande peut réellement être faite pour supporter la chaîne, l'annulation, la transaction, etc. dans la commande MVVM est loin du modèle de commande. L'idée principale d'utiliser la commande dans MVVM car ICOMMAND est le seul moyen de faire la liaison avec l'opération. Dans Flex, vous liez facilement la méthode pour l'événement à l'aide de click = "{ci-après" {mentionnement ()} " mais pas dans WPF.

localisateur modèle

C'est une mauvaise pratique pour centraliser votre état d'application sur un seul modèle de localisateur comme [c]. De l'autre côté, vous aurez perdu une chance de "facilement" tester votre code si vous le faites. Plus votre code dépend plus, le plus difficile votre test, si votre localisateur de modèle contient des tonnes de modèles plus petits que vous ne mettez déjà beaucoup de dépendance à votre code. Et la chose la plus effrayante utilisant Singleton est qu'il est impossible de se moquer. Donc, si votre localisateur modèle n'est pas uni-tests bien que votre processus de test unitaire peut être plein de douleur.

En réalité, pas de meilleures pratiques utilisées dans le context de MVVM pour le modèle partagé entre des vues comme vous le mentionnez, mais vous devez jeter un coup d'oeil à Injection de dépendance terme pour atteindre cela.

meilleures salutations


2 commentaires

Vous avez raison sur la vérification de la vérification d'un modèle centralisé, mais je pense toujours que de partager l'état de certains éléments mondiaux entre les modèles de vue Un modèle central est beaucoup plus simple à développer. Il s'agit d'un équilibre entre dure à code (= une probabilité plus grande d'erreurs) et de la facilité de test.


Oui, je suis d'accord, dans certains cas, il est acceptable, mais de programmer des logiciels de bonne qualité, nous devrions suivre quelques meilleures pratiques, vous pouvez le vérifier ici Misko.Heuvery.com/2008/08/17/singletons-are-pathologic-liar s . Le lien que je fournit en discutant sur Singleton, mais également mentionné sur l'état mondial qui n'était pas une meilleure pratique sur la programmation. Marquer que l'auteur du lien que je fournis est un coach Agile de Google Developer.



0
votes

Les gens discutant de MVVM ont fait apparaître trop théorique et Flex a une architecture vraiment différente de tous ensemble, ce qui rend MVVM peu compliqué pour les personnes provenant de Flex.

Permettez-moi de vous donner un exemple très simple,

In Flex, principalement nous créons un MXML pour un composant d'interface utilisateur et nous avons notre modèle obligatoire et nous écrivons surtout notre code dans les événements des composants UI ainsi que des composants non interfuré. Par exemple, WebService, httpService, etc., ils ne sont pas un composant de l'interface utilisateur, mais ils peuvent toujours être à l'intérieur du MXML et on peut accéder facilement au code MXML.

Donc, fondamentalement, vous pouvez avoir, modèle + contrôleur + contrôleur dans un fichier MXML organisé très facilement.

dans Silverlight, dans XAML, vous ne pouvez avoir que des éléments UI en tant qu'enfants de la page / contrôle de l'utilisateur que vous modifiez. Il existe des limitations, XAML vous permet de mettre votre élément non UI uniquement dans les ressources et la variable dactylographiée de la ressource que vous avez ajoutée n'est pas facilement accessible dans le code de XAML, vous devez appeler Rechercher une ressource pour accéder au code.

Pour faciliter les choses, MVVM vous oblige à définir différents fichiers.

Vous avez un fichier, c'est votre modèle lui-même, par exemple Customer.cs

Vous avez un autre fichier, c'est votre point de vue, qui est essentiellement une combinaison de commandes de modèle +. Et vous écrivez votre code de contrôleur dans l'événement exécuté de la commande.

Vous avez un autre fichier, c'est votre point de vue, la vue se lie fondamentalement à toutes les propriétés de ViewModel qui sont des modèles ou des commandes.


0 commentaires