Bagaimana Anda memisahkan tampilan dari logika dalam aplikasi Winform?

18

Saya tahu ada pola seperti MVC untuk memisahkan tampilan dari logika, namun, saya tidak tahu seberapa umum mereka dalam aplikasi Winform.

Untuk aplikasi C # Winform, saya dapat mulai dengan Formdan secara bertahap menambahkan komponen UI ke dalamnya, kemudian untuk acara komponen, ( click, textchanged...) Saya memanggil fungsi saya, atau langsung menulis logika saya di sana!

Saya tahu itu kebiasaan buruk, tapi saya tidak tahu apa cara terbaik untuk memulai proyek seperti itu di Visual Studio (templat, kerangka kerja, titik awal), Apakah MVC satu-satunya solusi? Haruskah saya melakukannya untuk proyek apa pun ?!

Saya ingin menerima beberapa panduan atau kerangka kerja ringan untuk memulai.

Ahmad
sumber
2
Berikut ini adalah tutorial lengkap untuk apa yang Anda cari: codebetter.com/jeremymiller/2007/07/26/…
Doc Brown

Jawaban:

25

Pola MVVM (Model-View-ViewModel) dapat digunakan dalam Winforms

Model

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

Melihat

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

Baca lebih lanjut tentang penyatuan data di Winforms dari MSDN

Fabio
sumber
0

Jelas WinForms tidak mendukung satu pola desain secara alami - pola yang mungkin tidak berfungsi adalah MVVM karena Anda tidak dapat "mengikat" data ke model tampilan dan memilikinya memperbarui data secara langsung.

Kalau tidak - saya akan mencoba WinForms dengan MVP - Saya pernah melihat yang dilakukan sebelumnya - inilah tautan untuk melihat https://winformsmvp.codeplex.com/

aggietech
sumber