10
votes

Quelle est votre expérience avec Abandoning MVVM pour l'architecture WPF basée à UserControl?

Nous avons construit une application importante basée sur la bibliothèque d'applications composite et mvvm en utilisant infragisme contrôles.

Pour gagner du temps et faire L'application plus simple, nous a supprimé l'exigence MVVM . Nous n'avons maintenant pas de présentateurs ni de points de vue et nos points de vue sont devenus de simples usesontrols créés comme ceci:

baseditor.cs: xxx

CustomerSitor.Cs: xxx

fenêtre1.cs.xaml: xxx

Outre le problème de la qualification et le fait que cela "se sent sale" faisant de la WPF comme ça, j'ai seulement expérimenté des effets positifs de cette décision, par exemple: < ul>

  • Nous pouvons hériter de nos utilisateurs d'usurettes non-xaml les uns des autres
  • Nous utilisons autant de code-derrière que nous voulons quel développement expédite
  • Attacher les contrôles infragistes directement à notre classe modèle provenant du service Web a dégagé des dizaines de petits problèmes de liaison que nous avions avec une infraction contraignante à Observablecollections
  • Même en STROD WPF, le manque d'observablections fait des problèmes tels que ne pas pouvoir créer un menu simple disparaître
  • Nous remplaçons l'épargggraprator One-One avec des événements directs à l'aide d'UserControls et code derrière, ce qui a effacé toutes sortes de problèmes avec des événements

    Quelqu'un d'autre a-t-il d'autre que le MVVM dans WPF avait des expériences similaires? Avez-vous rencontré des problèmes réels à long terme?


  • 2 commentaires

    Alors, où mettez-vous la logique de votre entreprise?


    Nous obtenons des données de nos services sur un ESB, la majeure partie de la logique commerciale est effectuée


    7 Réponses :


    7
    votes

    J'ai essayé cela et j'ai fini par retourner à mvvm. Vous vous retrouvez avec le même désordre de codé spingetti piloté par des événements que vous avez toujours retrouvé sous Windows Forms. Si je n'ai jamais à faire un autre myLabel.text = this.mylabeltext Je serai heureux.

    Ne me trompez pas mal - MVVM est plus difficile à coller avec et que vous devez vraiment connaître WPF pour le retirer . .

    Vous perdez beaucoup en ne l'utilisant pas, y compris une grande capacité d'utiliser l'expression mélangé pour styler vos commandes et vos datatempates.


    0 commentaires

    3
    votes

    Hey, tout ce qui fonctionne pour vous. Il est trop facile d'obtenir religieux à ce sujet. Mes applications glissent dans un code spaghetti à moins que je ne prenne une attention assez stricte à la séparation des préoccupations, mais cela ne signifie pas que MVVM est le seul moyen d'aller. Si vous avez une application qui fonctionne et que vous pouvez changer sans tas d'effets secondaires en cascade, je dirais alors aller avec elle.

    Je serais respectueusement en désaccord (pas de bowtvote) avec Anderson IMES sur un point: je ne trouve pas de mvvm difficile à rester en contact avec; Je trouve ça très facile. Pour moi, c'est l'approche la plus simple et la plus naturelle de la conception des applications WPF. Je l'utilise dans le cadre de composites WPF (Prism), qui fournit un cadre très robuste pour partitionnement des applications complexes.

    J'ai écrit un Article de codeProject sur la mise en œuvre MVVM dans un réel application mondiale. Espérons que les gens entrent juste dans MVVM le trouveront utiles.


    4 commentaires

    Si vous venez de Winforms, MVVM n'est pas naturel et a une courbe d'apprentissage plus raide, c'est tout ce que je dis que je dites ... Vous devez apprendre beaucoup sur WPF Binding, Datacontexts, AttachmentProperties, etc. pour vraiment le faire payer pour vous .


    MVVM a beaucoup de sens dans l'ensemble, peut-être essayions-nous simplement de faire trop avec elle, c'est-à-dire de créer des formulaires dynamiques basés sur XML des services. Avec UserControls liés au modèle, nous avons beaucoup plus de contrôle.


    Anderson - Oui, je suis d'accord que venir de Winforms, MVVM peut avoir une courbe d'apprentissage. MVVM est beaucoup plus facile à apprendre si vous avez des résultats WinForms avec le modèle de contrôleur de modèle, qui présente de nombreuses similitudes avec MVVM.


    Edward - Oui, il semble que vous puissiez avoir essayé de faire plus avec MVVM que le motif peut gérer. Au lieu de créer des formes dynamiques, la meilleure pratique actuelle semble être d'utiliser le prisme pour charger des modules dans une fenêtre de coquille, car vous en avez besoin, autant que vous semblez faire avec les contrôles de l'utilisateur. Prisme vaudrait certainement la peine d'être un look, car il fournit une grande infrastructure pour des communications couplées de manière lâche entre modules.



    1
    votes

    Un modèle de vue est bon car il facilite la diffusion de la base de données. La base de données ne couvre pas tout ce que vous devez faire, alors certains code attaché au XAML sont pratiques.

    Dans mon expérience, un mélange de modèle de vision et une attachement aux événements semble faire le travail jusqu'à ce qu'une approche plus pure puisse être élaborée si nécessaire.

    EDIT:

    La fixation aux événements ne casse pas nécessairement le modèle MVVM si vous utilisez le gestionnaire d'événements pour transférer l'événement de la logique du gestionnaire dans votre viewModel ou un autre objet responsable.

    Il y a des avantages à la diffusion de la base de données pure en ce sens que vous pouvez plus facilement faire différentes peaux XAML qui utilisent la même viewModel. Un exemple est d'avoir une peau de débogage qui expose une partie des travaux intérieurs pour aider au développement et une peau de travail qui est le produit final. Les différentes vues XAML peuvent se lier au même point de vue.


    0 commentaires

    35
    votes

    Nous pouvons hériter nos ustères non-XAML USERCONTROLS les uns des autres

    Je ne comprends pas. Qu'en est-il de MVVM exclut l'héritage?

    Nous utilisons autant de code-derrière que nous voulons que nous souhaitons le développement Expédié

    Le code-derrière va bien tant que c'est le code qui est concerné par la vue. c'est à dire. pas la logique commerciale que vous souhaitez tester. Séparation des préoccupations et tous.

    Vous pouvez toujours faire du MVVM tout en tout faisant tout en code - même votre vue. MVVM ne concerne pas zéro code derrière. Il s'agit de séparer les préoccupations et les avantages que vous découlez de cela. Si vous n'avez pas besoin de concevoir vos points de vue en mélange, alors par tous les moyens, vous pouvez manifester beaucoup ou toute la vue sous forme de code. Heck, même si vous do avez besoin de travailler dans le mélange, il y a une certaine quantité de votre point de vue qui pourrait toujours être manifesté comme code. Vous avez juste besoin d'évaluer les compromis et de prendre des décisions conscientes et éclairées.

    Fixation des commandes infragistes directement à notre classe de modèle provenant du service Web a dégagé des dizaines de petits problèmes de liaison que nous avions avec une infraction contraignante aux observablections

    Les contrôles d'infragisme sont extrêmement pauvres. Là, je l'ai dit. Si c'est une option, ne les utilisez pas. Si ce n'est pas une option (et que j'ai également été dans cette position), vous pouvez normalement travailler autour de nombreux problèmes avec des comportements attachés et d'autres techniques. C'est un problème, oui, mais ne blâmez pas MVVM - blâme les infranguistiques pour la production d'un ensemble de contrôle qui est tellement en attente avec la plate-forme WPF.

    Même en WPF droit, l'absence d'observablections permet de ne pas pouvoir créer un menu simple disparaître

    Je ne comprends pas ce point du tout. Observablecollections font partie du WPF, pas de MVVM. Et ayant lu votre question (encore une fois, je me suis répondu à cela peu de temps après que vous l'avez soumise), je dirais que ce n'est que votre malentendu de la façon dont WPF fonctionne - rien à voir avec MVVM.

    Nous remplaçons l'épargggrappator One-one avec des événements directs à l'aide d'Usercontrols et code derrière, ce qui a effacé toutes sortes de problèmes avec des événements

    outil droit pour le bon travail. Si vous pouvez utiliser des événements directs, vous pouvez le faire si vous utilisez MVVM ou non. MVVM ne nécessite en aucune manière l'utilisation du modèle d'agrégateur d'événement, alors encore une fois votre point n'est pas clair. Le modèle d'agrégateur d'événement peut être utilisé pour s'assurer que différents composants peuvent collaborer au moment de l'exécution sans dépendances de compilation. En utilisant des événements CLR standard, vous créez de fortes dépendances entre vos composants. Si vous voulez jamais les utiliser de manière isolée, vous allez avoir une dizaine de temps.

    En résumé, cela n'a pas beaucoup de cas contre MVVM, mais plus un manque de compréhension. Je pense que vous nageez en amont et je vous conseillerais de regarder de plus près MVVM. Ce n'est pas une balle d'argent ni une schéma unique, mais il peut être sûr d'aider à créer une base fantastique pour vos applications WPF / SL lorsqu'il est utilisé correctement.


    6 commentaires

    +1 sur les points d'agrégateur d'événement. J'ai vu beaucoup de malentendus sur son utilisation ... Beaucoup de gens pensent que lorsque vous utilisez MVVM + Prism, vous devez utiliser Utilisez l'agrégateur d'événements pour soulever des événements, lorsque cela n'est tout simplement pas vrai.


    Je dois dire mec ... J'en ai relis cela comme 10 fois. Bien fait rompre ses commentaires. Je n'ai pas lu le poteau de l'Op aussi étroitement que vous ... vous avez vraiment frappé tous les points. Très agréable.


    Merci pour cette longue réponse, très utile. Je vais examiner de plus près le MVVM une fois que nous avons dépassé nos échéances que la programmation de contrôle de contrôle de l'utilisateur de Winform-Winform-Winform aidez-nous à atteindre. Qu'en est-il du MVVM exclut l'héritage? Je comprends une vue comme un Usercontrol avec XAML et Code-derrière. Si vous avez un CustomerEditorView et un employéAdeditorView et vous réalisez que celles-ci ont des fonctionnalités similaires qu'elles doivent inhériter à partir d'une baseDeditorView, vous ne pouvez pas hériter de XAML comme vous pouvez trouver un code purs UserControl comme dans le code ci-dessus. C'était une victoire majeure pour nous lorsque nous avons changé par exemple.


    Un autre point que je n'ai pas mentionné est: avec MVVM, vos images de vue doivent avoir toutes les propriétés du modèle et il semblait être une réplication de code inutile dans les nombreux cas que nous n'utilisions pas la fonctionnalité NitivementPropertyChanged. Cela s'est éloigné lorsque nous avons connecté le USERCONTROL directement au modèle et la validation par ex. que nous utilisions inotinyPropertychangned pour, nous faisons maintenant un code simple derrière où nous en avons besoin.


    Les observablecollections font partie du WPF: Ouais, je sais que, mais au lieu de passer des jours à essayer d'obtenir un simple ménulseurs à se lier correctement à une observablecolection ( Stackoverflow.com/questions/1067903/... ), Je passe maintenant quelques minutes simplement la construire dans le code derrière, qui ne peut être testée par une vue imprimée sur mon point de vue, mais qui accomplit rapidement la tâche simple.


    +1 Pour cela: "MVVM ne concerne pas zéro code derrière. Il s'agit de séparer les préoccupations et les avantages que vous découlez de cela."



    10
    votes

    J'ai commencé à faire des applications WPF dans un modèle de conception FFA (Free-pour-tous) comme celui-ci et je ne reviendrai pas, même pour un petit projet. Bien que vous ayez l'impression que vous soyez plus productif à droite à la source, Bare-Metal UI, je suis arrivé à la conclusion que c'est plus une perception de la productivité parce que vous obtenez gratification instantanée .

    considérer: textblock.text = "helloworld" . Pas de vue de la vue à construire, sans collage des configurations V et VM ou de liaison. Hit F5 et nous voyons "helloworld" dans toute sa gloire. Mon problème avec cela est multiforme. Voici quelques-unes de mes principaux problèmes:

    • séparation des préoccupations . Sans elle, la navigation de code, la fixation des bugs, Extensibilité et maintenance générale est sévèrement entravé. Ajouter un fonctionnalité à une application serait plus adjacent à un choisir-votre livre d'aventure ou un exercice en physique quantique que est en train de faire quelque chose. Si vous avez une façon prévisible de Construisez votre application, vous avez un manière prévisible de travailler dessus.

      flexibilité de l'interface utilisateur . Lorsque vous utilisez le motif FFA, j'ai trouvé mon capacité à concevoir l'interface utilisateur dans mon Les applications étaient presque impossibles. Trop de fois j'ai eu un contrôle I ne pouvait concevoir pas en mélange. Il serait juste donner une frontière rouge avec un exception. Certains codes-derrière j'avais utilisé quelque chose d'autre qui n'était pas utilisable en mode de conception causant un problème. Déménager à MVVM par magie Correction de tous mes problèmes de mélange. Si j'obtiens Une frontière rouge en mélange maintenant, je sait C'est un problème avec ma présentation code. Pas quoi que ce soit d'autre.

      Ainsi, l'utilisation de FFA peut obtenir votre V1 sur la porte rapidement, mais les PHBS se demanderont pourquoi v1.5 va prendre quatre fois plus long que v1. Nous avons tous été là :)

      Je pense que si vous voulez faire quelque chose comme ça, je fonctionnerais avec des contrôles impressionnants, où vous définissez les "parties" de l'interface utilisateur, ce qui le rendrait très mélangé. Vous faites référence aux commandes d'interface utilisateur via l'ONAPPLYTEMPATE. Ces contrôles sont totalement stylables et héritables. C'est votre opinion où vous utiliseriez ces commandes et tirez des données de la liaison, en passant à vos commandes imperméables. La vue, imo, doit toujours être colle pour que la machine virtuelle se lie à ces types de commandes.

      Pour les contrôles d'infragisme, vous rencontrez des problèmes, en supposant que vous utilisiez du prisme, vous devez effectuer un adaptateur de région personnalisé pour cela. Cela vous permet de coder exactement comment les contrôles seront ajoutés à l'infraction. Pas de liaison impliquée. Voir l'injection fonctionnera simplement comme si vous êtes habitué à une fois que vous avez obtenu cet introduit.

      J'ai vu certaines personnes ont des problèmes comme ceux-ci à la MVVM, mais je crois que cela ne prend que le MVVM trop littéralement. Tout n'est pas étiré par un messager. My ~ 40 Application de la vue (et de la croissance) a environ 5 événements composites. Je hérite des contrôles, j'utilise l'injection d'affichage sur des choses qui ne sont même pas des panneaux ni des contrôles de contenu. Parfois, j'ai un code de code de CodeBehind Présentation Code associé / Événements ... et ... vraiment, je préconise MVVM et je ne donne pas de @ $ et% sur tests :)


    1 commentaires

    J'aimerais voir une application de démonstration réelle faite avec MVVM (et non une chose qui fait une chose simple comme STOYCHTRADER), mais quelque chose qui se connecte à une base de données avec une capacité de CRUD complète, qui utilise une infraction ou un Telerik ou un troisième monde réel -Les composantes de près, et qui ont une sorte d'évolutivité telle que des contrôles injectés sur les limites du projet. Lorsque tous ces aspects du monde réel entrent dans votre application, on est obligé de reculer de MVVM, ce serait un bien de voir où l'on tombe sur le dos et de voir ce que les compromis sont, des tests d'interface utilisateur limité, etc.



    5
    votes

    Je ne suis pas d'accord avec cela, J'ai travaillé sur une application de banque à grande échelle à l'aide de contrôles WPF, MVVM, WCF et Telerik. Au début, l'utilisation de MVVM était un peu difficile, mais une fois que nous Installé avec notre conception et le cadre de modèle de vue C'est devenu très facile. La réutilisabilité était très facilement réalisable et le temps de développement a également été réduit.

    En outre, il était très facile de changer les commandes; Dans certains endroits, nous avions utilisé des contrôles de base du WPF que nous avons remplacé par la suite avec Telerik Controls et inversement (comme dans certains endroits, nous n'avions pas besoin de contrôles de Telerik lourds tels que GridView). Je peux dire que si nécessaire, nous aurions pu facilement remplacer tous les commandes Telerik avec d'autres contrôles de 3e parties ou des commandes WPF natives facilement à tout moment.

    Mais oui, nous avons dû mettre en œuvre des solutions de contournement lors de l'utilisation de commandes Telerik et écrivons du code dans CodeBeHind pour résoudre certains problèmes (bogues dans Telerik); Tout ce code était purement de présentation logique.


    0 commentaires

    2
    votes

    Les avocats de MVVM sur l'état de leur état. Ils prétendent que l'alternative à MVVM est nécessairement du code spaghetti. Ce qui décrit Edward suit toujours un motif, ce n'est tout simplement pas MVVM. Le fait que les vues liés aux modèles soient similaires à MVC. Le code derrière peut être considéré comme le contrôleur.

    Clairement, il estime que les résultats sont meilleurs en termes d'effort de développement et de maintenabilité. Comme ce dernier est la seule justification valable pour un modèle de conception, le cas contre son approche n'est pas clair.

    Dire "Vous ne comprenez pas MVVM" n'est pas vraiment un argument contre son approche. Un modèle plus facile à comprendre est meilleur que celui qui n'est pas.


    1 commentaires

    Pour l'enregistrement, j'utilise MVVM et estime que cette approche est plus propre et plus maintenue. Je vais admettre qu'il est plus difficile de mettre en place correctement.