Làm thế nào để bạn tách chế độ xem khỏi logic trong ứng dụng Winform?


18

Tôi biết có các mẫu như MVC để tách biệt chế độ xem khỏi logic, tuy nhiên, tôi không biết mức độ phổ biến của chúng trong các ứng dụng Winform.

Đối với ứng dụng Winform C #, tôi có thể bắt đầu bằng Formvà thêm dần các thành phần UI vào nó, sau đó cho các sự kiện của các thành phần, ( click, textchanged...) Tôi gọi các chức năng của mình hoặc trực tiếp viết logic của mình ở đó!

Tôi biết đó là một thói quen xấu, nhưng tôi không biết cách tốt nhất để bắt đầu một dự án như vậy trong Visual Studio (mẫu, khung, điểm bắt đầu) là gì, MVC có phải là giải pháp duy nhất không? Tôi có nên làm điều đó cho bất kỳ dự án?!

Tôi muốn nhận được một số hướng dẫn hoặc khung nhẹ để bắt đầu.


2
Dưới đây là một hướng dẫn đầy đủ cho những gì bạn đang tìm kiếm: codebetter.com/jeremymiller 2007/07/26 / Giả
Doc Brown

Câu trả lời:


25

Có thể sử dụng Mẫu MVVM (Model-View-ViewModel) trong Winforms

Mô hình

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

Lượt xem

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

Đọc thêm về cơ sở dữ liệu trong Winforms từ MSDN


0

Rõ ràng WinForms không hỗ trợ một mẫu thiết kế nào khác - mẫu có thể không hoạt động là MVVM vì bạn không thể "liên kết" dữ liệu với mô hình xem và để nó cập nhật dữ liệu trực tiếp.

Mặt khác - tôi sẽ thử WinForms với MVP - Tôi đã thấy điều đó được thực hiện trước đây - đây là một liên kết để xem https://winformsmvp.codeplex.com/

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.