Como você separa a visualização da lógica em um aplicativo Winform?

18

Eu sei que existem padrões como o MVC para separar a visualização da lógica, no entanto, não sei quão comuns eles são nos aplicativos Winform.

Para um aplicativo C # Winform, posso começar com um Forme gradualmente adicionar componentes de interface do usuário a ele; depois, para os eventos de componentes, ( click, textchanged...) chamo minhas funções ou escrevo diretamente minha lógica!

Sei que é um mau hábito, mas não sei qual é a melhor maneira de iniciar um projeto desse tipo no Visual Studio (um modelo, uma estrutura, ponto de partida). O MVC é a única solução? Devo fazê-lo para qualquer projeto ?!

Gostaria de receber algumas diretrizes ou estrutura leve para começar.

Ahmad
fonte
2
Aqui está um tutorial completo para o que você está procurando: codebetter.com/jeremymiller/2007/07/26/…
Doc Brown
1
Verifique esta ligação de dados do Windows Forms
Fabio

Respostas:

25

O padrão MVVM (Model-View-ViewModel) pode ser usado no 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));
        }
    }
}

Visão

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

Leia mais sobre a ligação de dados no Winforms do MSDN

Fabio
fonte
0

Obviamente, o WinForms não suporta nativamente um padrão de design sobre outro - o que pode não funcionar é o MVVM porque você não pode "vincular" os dados ao modelo de exibição e atualizá-los diretamente.

Caso contrário - eu tentaria o WinForms com MVP - já vi isso antes - aqui está um link para https://winformsmvp.codeplex.com/

aggietech
fonte