Winform uygulamasında görünümü mantıktan nasıl ayırırsınız?


18

Görünümü mantıktan ayırmak için MVC gibi desenler olduğunu biliyorum, ancak Winform uygulamalarında ne kadar yaygın olduklarını bilmiyorum.

Bir C # Winform uygulaması için, bir ile başlayabilir Formve yavaş yavaş UI bileşenleri ekleyebilirim, daha sonra bileşen olayları için, ( click, textchanged...) İşlevlerimi çağırırım veya doğrudan mantığımı oraya yazabilirim!

Bunun kötü bir alışkanlık olduğunu biliyorum, ancak Visual Studio'da (bir şablon, bir çerçeve, başlangıç ​​noktası) böyle bir projeye başlamanın en iyi yolunun ne olduğunu bilmiyorum, MVC tek çözüm mü? Herhangi bir proje için yapmalı mıyım ?!

Başlamak için bazı yönergeler veya hafif bir çerçeve almak istiyorum.


2
İşte aradığınız şey için tam bir öğretici: codebetter.com/jeremymiller/2007/07/26/…
Doc Brown

Yanıtlar:


25

MVVM (Model-View-ViewModel) Kalıbı 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));
        }
    }
}

Görünüm

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

MSDN'den Winforms'da veri bağlama hakkında daha fazla bilgi edinin


0

Açıkçası WinForms, bir tasarım desenini diğerine göre yerel olarak desteklemez - çalışmayan model MVVM'dir, çünkü verileri görünüm modeline "bağlayamazsınız" ve verileri doğrudan güncellemesini sağlayamazsınız.

Aksi takdirde - MVP ile WinForms'u denerdim - Daha önce yapıldığını gördüm - işte https://winformsmvp.codeplex.com/

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.