WinForm中的MVC模式(好吧,砖家们都叫MVP模式)

本文主要介绍MVC模式在WINFORM中的实现,其实砖家们都称它为MVP模式,小弟E文不太好,真的是记不住那个P怎么拼写的。。

MVC模式主要解决的问题就是将表示层和业务层进行分离,在以往做WINFORM项目的时候,通常都是将很多的逻辑代码直接写在了Form.cs代码的事件里,这样的话业务逻辑就和界面紧耦合在一起了,现在我们采用MVC来解耦。

首先建立Model:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ComponentModel;

namespace WindowsFormsApplication10
{
    public class Person : INotifyPropertyChanged
    {
        private string _id;
        public string ID
        {
            get { return _id; }
            set { _id = value; OnPropertyChanged("ID"); }
        }
        private string _name;

        public string Name
        {
            get { return _name; }
            set { _name = value; OnPropertyChanged("Name"); }
        }

        #region INotifyPropertyChanged 成员

        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged(string PropertyName)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(PropertyName));
            }
        }
        #endregion
    }

}

为了能支持双向绑定数据,Model实现了INotifyPropertyChanged接口.

再看看Controllor的实现:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace WindowsFormsApplication10
{
    public class PersonControllor
    {
        public PersonForm View;

        public Person Model;

        public PersonControllor(PersonForm view)
        {
            //初始化了一个Model
            Model = new Person() { ID = "1", Name = "xiaojun" };
            //通过构造函数将View注入到Controllor中
            this.View = view;

            //建立起View 和Controllor的关联
            //这时候View中能使用它所对应的Controllor进行业务逻辑的操作,Model也能和VIEW UI控件进行双向绑定
            this.View.Controllor = this;
            
        }


        /// <summary>
        /// 执行一个业务逻辑
        /// </summary>
        public void UpdatePerson()
        {
            UpdateToDataBase(Model);
        }

        private void UpdateToDataBase(Person p)
        {
            //do some thing
            //执行将数据插入到数据库的操作
            System.Windows.Forms.MessageBox.Show("ID:" + p.ID + " Name:" + p.Name);
        }


    }
}


然后是View的实现:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication10
{
    public partial class PersonForm : Form
    {
        private PersonControllor _controllor;

        public PersonControllor Controllor
        {
            get { return _controllor; }
            set
            {
                this._controllor = value;
                //绑定一定只能写在给Controllor赋值以后而不能写在PersonForm的构造函数中(此时Controllor还未被实例化)
                //因为我们这里采用的是Controllor-First而不是View-First,不然Controllor.Model为null会异常
                //将View通过构造函数注入到Controllor中的属于Controllor-First,这时候Controllor先创建
                //将Controllor通过构造函数注入到View中的属于View-First,这时候View先创建
                this.textBox1.DataBindings.Add("Text", Controllor.Model, "ID");
                this.textBox2.DataBindings.Add("Text", Controllor.Model, "Name");
            }
        }





        public PersonForm()
        {
            InitializeComponent();


        }

        private void button1_Click(object sender, EventArgs e)
        {
            //改变VIEW的UI控件的值,Controllor的Model会跟着变
            this.textBox1.Text = "2";
            this.textBox2.Text = "jacky";
            Controllor.UpdatePerson();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            //改变Controllor的Model的值,VIEW的UI控件的值会跟着变
            Controllor.Model.ID = "2";
            Controllor.Model.Name = "jacky";
            
            Controllor.UpdatePerson();
        }

        private void PersonForm_Load(object sender, EventArgs e)
        {

        }
    }
}


最后是程序启动:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace WindowsFormsApplication10
{
    static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            //Controllor-First模式,先创建Controllor(PersonControllor)再将View(PersonForm)注入到Controllor(PersonControllor)中
            PersonControllor controllor = new PersonControllor(new PersonForm());
            Application.Run(controllor.View);
        }
    }
}

 

  • 1
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值