Come si separa la vista dalla logica in un'applicazione Winform?


18

So che esistono schemi come MVC per separare la vista dalla logica, tuttavia, non so quanto siano comuni nelle applicazioni Winform.

Per un'applicazione C # Winform, posso iniziare con un Forme aggiungere gradualmente componenti dell'interfaccia utente ad esso, quindi per gli eventi dei componenti, ( click, textchanged...) chiamo le mie funzioni o scrivo direttamente la mia logica lì!

So che è una cattiva abitudine, ma non so quale sia il modo migliore per avviare un simile progetto in Visual Studio (un modello, un framework, un punto di partenza), MVC è l'unica soluzione? Dovrei farlo per qualsiasi progetto ?!

Vorrei ricevere alcune linee guida o un framework leggero per iniziare.


2
Ecco un tutorial completo per quello che stai cercando: codebetter.com/jeremymiller/2007/07/26/…
Doc Brown

1

Risposte:


25

Il modello MVVM (Model-View-ViewModel) può essere utilizzato in Winforms

Modello

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));
        }
    }
}

Visualizza

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);
    }
}

Scopri di più sulla banca dati in Winforms da MSDN


0

Ovviamente WinForms non supporta nativamente un modello di progettazione su un altro: quello che potrebbe non funzionare è MVVM perché non è possibile "associare" i dati al modello di vista e farlo aggiornare direttamente.

Altrimenti, proverei WinForms con MVP, l'ho già visto prima, ecco un link per consultare https://winformsmvp.codeplex.com/

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.