Wie trennt man die Ansicht von der Logik in einer Winform-Anwendung?

18

Ich weiß, dass es Muster wie MVC gibt, die die Ansicht von der Logik trennen, aber ich weiß nicht, wie häufig sie in Winform-Anwendungen vorkommen.

Für eine C # Winform-Anwendung beginne ich mit a Formund füge ihr nach und nach UI-Komponenten hinzu. Dann rufe ich für die Ereignisse von Komponenten ( click, textchanged...) meine Funktionen auf oder schreibe meine Logik direkt dorthin!

Ich weiß, dass dies eine schlechte Angewohnheit ist, aber ich weiß nicht, wie ein solches Projekt in Visual Studio am besten gestartet werden kann (Vorlage, Framework, Ausgangspunkt). Ist MVC die einzige Lösung? Soll ich es für ein Projekt tun ?!

Ich möchte einige Richtlinien oder ein leichtes Framework erhalten, um loszulegen.

Ahmad
quelle
2
Hier ist ein vollständiges Tutorial für das, was Sie suchen: codebetter.com/jeremymiller/2007/07/26/…
Doc Brown
1
Überprüfen Sie diese Windows Forms-Datenbindung
Fabio

Antworten:

25

Das MVVM-Muster (Model-View-ViewModel) kann im verwendet werden Winforms

Modell

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

Aussicht

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

Weitere Informationen zur Datenbindung in Winforms von MSDN

Fabio
quelle
0

Offensichtlich unterstützt WinForms ein Entwurfsmuster nicht nativ über ein anderes - dasjenige, das möglicherweise nicht funktioniert, ist MVVM, da Sie keine Daten an das Ansichtsmodell "binden" und die Daten direkt aktualisieren können.

Andernfalls - ich würde versuchen, WinForms mit MVP zu erstellen - habe ich schon einmal gesehen - hier ist ein Link zu https://winformsmvp.codeplex.com/

aggietech
quelle