65 votes

Méthodologie de programmation WPF

Après 3 mois de programmation de mon APPLI WPF, j'ai cru à propos de la façon dont je suis la programmation de mon appli (je sais que c'est peut-être trop tard). Sur mon APPLICATION que je suis en utilisant une API d'un logiciel que mon outil de gestion. J'ai DAL qui contiennent des 16 classes, 3 d'entre eux sont des singletons. J'ai un peu de logique dans l' .cs fichiers et XAML's bien sûr. Ma question est, je vois beaucoup de commentaires qu'une application écrite en WPF doit utiliser MVVM, et cela permet de rendre le code plus facile à utiliser et facile à lire, puis-je transformer mon code pour être MVVM? qu'elle est la signification réelle de MVVM (pas de Wikipédia ou manuellement)?

J'ai aussi utiliser des requêtes SQL et j'ai lu un papier sur EF (Entity Framework), peut MVVM et EF de coexister dans le même projet?

Je sais ma question est un peu newbie question (je suis newbie :P) et une question abstraite, mais je veux savoir que l'application que je vais écrire sera le meilleur que je peux écrire en ce moment :)

128voto

HighCore Points 23088

La signification réelle de MVVM est: UI n'est pas une donnée. Les données sont des Données, l'INTERFACE utilisateur de l'INTERFACE utilisateur.

Cela signifie que vous ne devrait pas développer l'application de sorte que la logique du programme (souvent appelé " business logic) est étroitement couplée ou dépendant de l'état des composants de l'INTERFACE utilisateur, mais au lieu de le rendre dépendant de l'état des éléments de données (que ce soit le Modèle ou le Modèle de Vue).

Par exemple, dans d'autres cadres (tels que les winforms), si vous avez un écran qui contient une zone de texte et un bouton, vous l'habitude d'ajouter un gestionnaire d'événements click pour le bouton, puis de lire le texte de la zone de texte. dans MVVM, la propriété Text de la zone de texte doit être lié à une propriété de type chaîne dans le ViewModel, et le bouton doit être lié à une Commande dans le ViewModel ainsi.

Cela permet une abstraction de l'INTERFACE utilisateur (qui est le ViewModel), de sorte que, comme je l'ai dit avant, la logique de l'application peuvent être dépend pas de l'INTERFACE utilisateur, mais une abstraction d'elle.

Cela permet une énorme quantité d'évolutivité dans l'INTERFACE utilisateur et la logique, et permet également la testabilité de plusieurs aspects de l'INTERFACE utilisateur, le comportement parce qu'une grande partie de l'INTERFACE, le comportement est défini dans le ViewModel.

Il y a d'autres aspects de MVVM, mais la principale réalisation est que.

Edit:

Je vais ajouter un exemple concret de ce pour l'intégralité de la réponse:

1 - Non WPF MVVM:

XAML:

<StackPanel>
   <TextBox x:Name="txtLastName"/>
   <Button Content="Click Me" Click="Button_Click"/>
</StackPanel>

Code derrière:

private void Button_Click(object sender, EventArgs e)
{
    var lastname = this.txtLastName.Text; //Assuming this is the code behind the window that contains the above XAML.

    //Here you do some actions with the data obtained from the textbox
}

2 - WPF MVVM:

XAML:

<StackPanel>
   <StackPanel.DataContext>
       <my:MyViewModel/>
   </StackPanel.DataContext>
   <TextBox Text="{Binding LastName}"/>
   <Button Content="Click Me" Command="{Binding MyCommand}"/>
</StackPanel>

ViewModel:

public class MyViewModel
{
    public string LastName {get;set;}

    public Command MyCommand {get;set;}

    public MyViewModel()
    {
        MyCommand = new Command(ExecuteMyCommand); // The command recieves an action on the constructor, which is the action to execute when the command is invoked.
    }

    private void ExecuteMyCommand()
    {
        var lastname = this.LastName; //Only for illustration purposes, not really needed.

        //Here you do some actions with the data obtained from the textbox
    }

}

Comme vous pouvez le voir dans l'exemple ci-dessus, le ViewModel ne contient aucune référence à la Vue. Ainsi, le point de Vue pourrait être n'importe quoi, tant que l' {Bindings} sont restées en place.

La colle qui comme par magie les fait travailler ensemble, c'est l' DataContext de la Propriété de WPF Éléments de l'INTERFACE utilisateur, qui est l'objet de toutes les liaisons seront résolus.

Il y a d'autres choses, telles que la Notification de Modification de Propriété du ViewModel pour permettre des liaisons bidirectionnelles, mais qui est hors de la portée de cette réponse.

Aussi garder à l'esprit que MVVM est un modèle de conception, alors que WPF est un cadre. MVVM est également en cours actuellement appliquées dans d'autres technologies (il y a actuellement beaucoup de buzz sur le modèle MVVM pour le web, avec du JavaScript et des trucs comme ça)

Je vous conseille de lire les livres mentionnés dans d'autres réponses, aussi bien que ce Tutoriel pour plus d'WPF-aspects spécifiques.

15voto

Big Daddy Points 2147

Ma question est, je vois beaucoup de commentaires qu'une application écrite dans WPF devrait utiliser MVVM, et cela permet de rendre le code plus facile à utiliser et lisible, puis-je transformer mon code pour être MVVM?

Il n'y a pas d'obligation que vous avez besoin d'utiliser le modèle MVVM - aucun. Vous devez tenir compte de la complexité de l'application des capacités et le développement des groupes de compétences. En général, si c'est un de petites de petites et moyennes app puis MVVM peut - être plus de génie. Si les compétences du groupe et le talent ne sont pas un bon ajustement pour un modèle de présentation distinct, puis il MVVM peut être pas une bonne décision.

Si c'est fait à droite, puis MVVM vous donne toutes les sortes d'avantages que vous avez lu sur. A l'inverse, si sa fait mal, alors il peut être une politique de développement et de maintenance cauchemar - certainement pas plus lisible et utilisable. Par expérience personnelle, je pense que c'est plus facile de travailler sur un mal écrit le code-behind de l'app plutôt qu'un mal écrit MVVM basée sur un.

Bien sûr, vous pouvez réécrire votre application actuelle de la pattern MVVM. Juste retirer votre code-behind et le mettre dans votre champ de vision modèles, helper classes, les classes de dépôt, biz-la logique des classes, etc. Ne tombez pas dans le piège de mettre tout en vous vue-modèles, la création d'un MVVM-glorifié code-behind.

J'ai aussi utiliser des requêtes SQL et j'ai lu un papier sur EF (Entity Framework), peut MVVM et EF laisser ensemble dans le même projet?

Bien sûr, ils peuvent. Rappelez-vous juste que EF est une technologie d'accès aux données et MVVM est un modèle de conception. Vous aurez probablement utiliser EF dans votre DAL classes que vous mentionnez.

Une dernière chose, si vous décidez d'aller en bas de la MVVM route, alors vous devriez considérer l'utilisation d'un framework qui facilite, comme Prism. Oh, et être prêt pour un peu d'apprentissage et de frustration.

2voto

Dr. ABT Points 8119

Je voudrais vraiment regarder dans DependencyInjection, à l'aide d'un framework comme Unité.

Votre Singleton classes pourrait être enregistré auprès d'un DependencyInjection conteneur et injecté dans les constructeurs des autres classes (comme le Viewmodel). Ainsi pourrait-autres DAL classes qui doivent être instancié régulièrement et injecté dans les classes.

DependencyInjection est le plus important motif de conception lors de l'élaboration de grandes applications d'entreprise et s'applique à la fois Client et Serveur de code. MVVM est un beau dessin, mais ne pas aborder la question de l'application globale de la complexité liée à la dépendance de couplage.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X