Як ви відокремлюєте погляд від логіки в програмі Winform?


18

Я знаю, що такі моделі, як MVC, відокремлюють погляд від логіки, однак я не знаю, наскільки вони поширені в додатках Winform.

Для програми C # Winform я можу почати з a Formі поступово додавати до нього компоненти інтерфейсу, тоді для подій компонентів, ( click, textchanged...) я викликаю свої функції або безпосередньо записую туди свою логіку!

Я знаю, що це шкідлива звичка, але я не знаю, який найкращий спосіб розпочати такий проект у Visual Studio (шаблон, рамка, відправна точка). Чи MVC єдине рішення? Чи потрібно це робити для будь-якого проекту ?!

Я хотів би отримати деякі рекомендації або полегшені рамки, щоб почати.


2
Ось повний підручник для того, що ви шукаєте: codebetter.com/jeremymiller/2007/07/26/…
Doc Brown

Відповіді:


25

Модель MVVM (Model-View-ViewModel) може бути використана в Winforms

Модель

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

Вид

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

Детальніше про прив'язування даних читайте в Winforms від MSDN


0

Очевидно, що WinForms не підтримує один шаблон дизайну над іншим - той, який може не працювати, - це MVVM, оскільки ви не можете "прив'язувати" дані до моделі перегляду та змушувати її безпосередньо оновлювати дані.

В іншому випадку - я б спробував WinForms з MVP - я це бачив раніше - ось посилання, щоб подивитися на https://winformsmvp.codeplex.com/

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.