¿Cómo se separa la vista de la lógica en una aplicación Winform?

18

Sé que hay patrones como MVC para separar la vista de la lógica, sin embargo, no sé qué tan comunes son en las aplicaciones Winform.

Para una aplicación C # Winform, puedo comenzar con Formy gradualmente agregarle componentes de UI, luego para los eventos de componentes, ( click, textchanged...) ¡llamo a mis funciones, o directamente escribo mi lógica allí!

Sé que es un mal hábito, pero no sé cuál es la mejor manera de comenzar un proyecto de este tipo en Visual Studio (una plantilla, un marco, un punto de partida). ¿MVC es la única solución? ¿Debo hacerlo para cualquier proyecto?

Me gustaría recibir algunas pautas o un marco ligero para comenzar.

Ahmad
fuente
2
Aquí hay un tutorial completo de lo que está buscando: codebetter.com/jeremymiller/2007/07/26/…
Doc Brown

Respuestas:

25

El patrón MVVM (Model-View-ViewModel) se puede utilizar en Winforms

Modelo

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

Ver

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

Lea más sobre enlace de datos en Winforms desde MSDN

Fabio
fuente
0

Obviamente WinForms no admite de forma nativa un patrón de diseño sobre otro; el que podría no funcionar es MVVM porque no puede "vincular" datos al modelo de vista y hacer que actualice los datos directamente.

De lo contrario, intentaría WinForms con MVP. Lo he visto antes. Aquí hay un enlace para ver https://winformsmvp.codeplex.com/

aggietech
fuente