it-swarm.com.de

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

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

Für eine C # Winform-Anwendung kann ich mit einem Form beginnen und nach und nach UI-Komponenten hinzufügen, dann für die Ereignisse von Komponenten (click, textchanged...) Ich rufe meine Funktionen auf oder schreibe dort direkt meine Logik!

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 irgendein Projekt machen?!

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

18
Ahmad

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

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

Lesen Sie mehr über die Datenbindung in Winforms von MSDN

25
Fabio

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

Andernfalls - ich würde WinForms mit MVP versuchen - habe ich das schon einmal gesehen - hier ist ein Link zum Anschauen von https://winformsmvp.codeplex.com/

0
aggietech