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

18

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 Formet y ajouter progressivement des composants d'interface utilisateur, puis pour les événements de composants, ( click, textchanged...) j'appelle mes fonctions, ou j'écris directement ma logique là-bas!

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.

Ahmad
la source
2
Voici un tutoriel complet pour ce que vous recherchez: codebetter.com/jeremymiller/2007/07/26/…
Doc Brown
1
Vérifiez cette liaison de données Windows Forms
Fabio

Réponses:

25

Le modèle MVVM (Model-View-ViewModel) peut être utilisé dans 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

Fabio
la source
0

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 mettre à jour directement.

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

aggietech
la source