Winform 애플리케이션에서 뷰와 로직을 어떻게 분리합니까?


18

로직과 뷰를 분리하는 MVC와 같은 패턴이 있다는 것을 알고 있지만 Winform 응용 프로그램에서 얼마나 공통적인지 잘 모르겠습니다.

C # Winform 응용 프로그램의 경우 FormUI 구성 요소로 시작하여 점차 UI 구성 요소를 추가 한 다음 구성 요소 이벤트 ( 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;}
}

뷰 모델

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

MSDN 에서 Winforms의 데이터 바인딩에 대해 자세히 알아보십시오


0

분명히 WinForms는 기본적으로 하나의 디자인 패턴을 지원하지 않습니다.보기 모델에 데이터를 "바인드"하고 데이터를 직접 업데이트 할 수 없기 때문에 작동하지 않을 수있는 패턴은 MVVM입니다.

그렇지 않으면-MVP로 WinForms를 시도합니다. 이전에 본 적이 있습니다. https://winformsmvp.codeplex.com/ 을 볼 수있는 링크가 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.