web-dev-qa-db-fra.com

Comment séparez-vous la vue de la logique dans une application Winform?

Je sais qu'il existe des modèles comme MVC pour séparer la vue de la logique, cependant, je ne sais pas à quel point ils sont courants dans les applications Winform.

Pour une application C # Winform, je peux commencer par un Form et y ajouter progressivement des composants d'interface utilisateur, puis pour les événements des composants, (click, textchanged...) J'appelle mes fonctions, ou y écris directement ma logique!

Je sais que c'est une mauvaise habitude, mais je ne sais pas quelle est la meilleure façon de démarrer un tel projet dans Visual Studio (un modèle, un framework, un point de départ), MVC est-il la seule solution? Dois-je le faire pour n'importe quel projet?!

J'aimerais recevoir des directives ou un cadre léger pour commencer.

18
Ahmad

Le modèle MVVM (Model-View-ViewModel) peut être utilisé dans le Winforms

Modèle

public class Person
{
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

ViewModel

public class PersonViewModel : INotifyPropertyChanged
{
    private Person _Model;

    public string FirstName
    {
        get { return _Model.FirstName; }
        set(string value)
        {
            _Model.FirstName = value;
            this.NotifyPropertyChanged("FirstName");
            this.NotifyPropertyChanged("FullName"); //Inform View about value changed
        }
    }

    public string LastName
    {
        get { return _Model.LastName; }
        set(string value)
        {
            _Model.LastName = value;
            this.NotifyPropertyChanged("LastName");
            this.NotifyPropertyChanged("FullName");
        }
    }

    //ViewModel can contain property which serves view
    //For example: FullName not necessary in the Model  
    public String FullName
    {
        get { return _Model.FirstName + " " +  _Model.LastName; }
    }

    //Implementing INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(String info)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(info));
        }
    }
}

Vue

public class PersonView: Form
{
    //Add two textbox and one label to the form
    //Add BindingSource control which will handle 
    //ViewModel and Views controls changes


    //As viewmodel you can use any type which of course have same named properties
    public PersonView(Object viewmodel)
    {
        this.InitializeComponents();

        this.ViewModelBindingSource.DataSource = viewmodel;
        this.InitializeDataBindings();
    }

    private void InitializeDataBindings()
    {
        this.TextBoxFirstName.DataBindings.Add("Text", this.ViewModelBindingSource, "FirstName", true);
        this.TextBoxLastName.DataBindings.Add("Text", this.ViewModelBindingSource, "LastName", true);
        this.LabelFullName.DataBindings.Add("Text", this.ViewModelBindingSource, "FullName", true);
    }
}

En savoir plus sur la liaison de données dans Winforms à partir de MSDN

25
Fabio

De toute évidence, WinForms ne prend pas en charge nativement un modèle de conception par rapport à un autre - celui qui pourrait ne pas fonctionner est MVVM car vous ne pouvez pas "lier" des données au modèle de vue et le faire mettre à jour les données directement.

Sinon - je tenterais WinForms avec MVP - je l'ai déjà vu - voici un lien à consulter https://winformsmvp.codeplex.com/

0
aggietech