【问题标题】:How minimize working time costs during work with old WinForms project?如何在使用旧的 WinForms 项目期间最大限度地减少工作时间成本?
【发布时间】:2019-03-01 08:11:01
【问题描述】:

我的主要目标是在使用旧的 WinForms 项目期间最大限度地减少工作时间成本。我已经做了一个实现 MCV + WinForms 的例子。有效。我有清晰的模型,但我在 Controller.cs 中有两种方法(OnSuper() 和 WorkMethod())——我不喜欢它们。它们不具备功能性,但是当有人在没有面包的情况下将黄油涂在黄油上时,它们看起来很有趣。如何在没有 MPV 和没有 WPF 的接口的情况下升级这个想法?或者这不是一个好方法,我必须创建一个新的 WPF 项目?

类模型.cs

class Model
{    
    public int X { get; set; }
    public int Y { get; set; }
    public int R { get; set; }
    public Model() { }
    public Model(int x, int y)
    {
        X = x;
        Y = y;
    }
    public int GetRes()
    {
        return X + Y;            
    }
}

类 Form1.cs

public partial class Form1 : Form
{        
    public Form1()
    {
        InitializeComponent();            
        button1.Click += delegate
        {
            Controller controller = new Controller
            (
                this, 
                Int32.Parse(this.textBox1.Text),
                Int32.Parse(this.textBox2.Text)
            );
            controller.SuperEvent += Controller_SuperEvent;
            controller.OnSuper();
        };
    }
    private void Controller_SuperEvent(object sender, EventArgs e)
    {
        Controller controller = sender as Controller;
        textBox3.Text = controller.WorkMethod();
        controller.WorkMethod();
    }
}

和类 Controller.cs

class Controller
{        
    public event EventHandler SuperEvent;
    Model model;
    Form1 form1;
    public int Result { get; set; }
    public int CX { get; set; }
    public int CY { get; set; }
    public Controller(Form1 form1, int cX, int cY)
    {
        this.form1 = form1;
        this.model = new Model();            
        CX = cX;
        CY = cY;
    }
    public void OnSuper()
    {
        SuperEvent?.Invoke(this, EventArgs.Empty);
    }
    public string WorkMethod()
    {            
        model.X = CX;
        model.Y = CY;
        return model.GetRes().ToString();
    }
}

【问题讨论】:

  • 如果代码看起来毫无意义,那么您做对了。 MVC 模式的重点是编写易于维护的代码。期望是十年后它不再看起来毫无意义,但你无法预测未来。顺便说一句,有很多用于 Winforms 的 MVC 框架,在自己动手之前一定要看看它们。

标签: c# winforms model-view-controller


【解决方案1】:

为了使可维护性更简单,在各层职责之间划清界限。

负责业务逻辑的模型

class Model
{    
    public int X { get; set; }
    public int Y { get; set; }

    public Model() {}

    public int GetRes() => X + Y
}

ViewModel 负责准备数据以在视图中显示(如果需要)并调用视图请求的模型业务逻辑操作。
INotifyPropertyChanged 将通知视图可能发生的更改,而视图模型不依赖于具体的视图类型。

class ViewModel : INotifyPropertyChanged
{    
    private readonly Model _model;

    public int X { get; set; }

    public int Y { get; set; }

    private string _result = "";
    public string Result 
    { 
        get
        {
            return _result;
        } 

        private set
        {
            if (_result.Equals(value) == false)
            {
                _result = value;
                RaisePropertyChanged();
            }

        }
    }

    public ViewModel(Model model) => _model = model;

    public void CalculateResult()
    {
         Result = _model.GetRes().ToString();
    }

    // Implementation of INotifyPropertyChanged
    public event PropertyChangedEventHandler PropertyChanged;

    private void RaisePropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

View,其职责是在用户请求时显示来自 viewmodel 的值或调用 viewmodel 操作。

public partial class View : Form
{    
    private ViewModel _viewmodel;

    public View()
    {
        InitializeComponent();   
        var model = new Model { X = 10, Y = 20 }  
        _viewmodel = new ViewModel(model);

        // Bind controls to the viewmodel
        textboxForX.DataBindings.Add("Text", _viewmodel, "X", true);
        textboxForY.DataBindings.Add("Text", _viewmodel, "Y", true);
        labelForResult.DataBindings.Add("Text", _viewmodel, "Result", true);            
    } 

    private void CalculateButton_Click(object sender, EvetnArgs e)
    {
        _viewmodel.Calculate();
    }
}    

请注意,在简单的情况下(如上),您可以跳过视图模型“层”并将视图直接绑定到模型。但是在视图和业务逻辑之间有一个“缓冲区”将使您在项目开始增长时更轻松。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2021-11-01
    • 1970-01-01
    • 2021-02-18
    • 2013-10-17
    • 2021-10-05
    相关资源
    最近更新 更多