คุณแยกมุมมองออกจากตรรกะในแอปพลิเคชัน Winform อย่างไร


18

ฉันรู้ว่ามีรูปแบบเช่น MVC เพื่อแยกมุมมองจากตรรกะ แต่ฉันไม่ทราบว่าเป็นเรื่องธรรมดาเพียงใดในแอปพลิเคชัน Winform

สำหรับแอปพลิเคชัน C # Winform ฉันอาจเริ่มต้นด้วยFormและค่อยๆเพิ่มส่วนประกอบ 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;}
}

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

ดู

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

อ่านเพิ่มเติมเกี่ยวกับ databinding ใน Winforms จาก MSDN


0

เห็นได้ชัดว่า WinForms ไม่สนับสนุนรูปแบบการออกแบบหนึ่งโดยทางตรงข้าม - รูปแบบที่อาจไม่ทำงานคือ MVVM เพราะคุณไม่สามารถ "ผูก" ข้อมูลกับรูปแบบการดูและอัปเดตข้อมูลได้โดยตรง

มิฉะนั้น - ฉันจะลอง WinForms ด้วย MVP - ฉันเคยเห็นมาก่อนหน้านี้ - นี่คือลิงค์สำหรับดูที่https://winformsmvp.codeplex.com/

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.