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

14

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

Per un'applicazione C # Winform, potrei iniziare con una Form e aggiungere gradualmente componenti dell'interfaccia utente, quindi per gli eventi dei componenti, ( click , textchanged ...) chiamo le mie funzioni, o scrivi direttamente la mia logica lì!

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

Desidero ricevere alcune linee guida o framework leggero per iniziare.

    
posta Ahmad 23.03.2015 - 16:42
fonte

2 risposte

20

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

Per saperne di più sull'associazione dati in Winforms da MSDN

    
risposta data 23.10.2015 - 17:37
fonte
0

Ovviamente WinForms non supporta in modo nativo uno schema di progettazione rispetto a un altro - quello che potrebbe non funzionare è MVVM perché non è possibile "legare" i dati al modello di vista e farlo aggiornare direttamente i dati.

Altrimenti, proverei WinForms con MVP - l'ho già visto prima - ecco un link per consultare il link

    
risposta data 23.03.2015 - 16:49
fonte

Leggi altre domande sui tag