Winform像Wpf MVVM那样进行界面数据绑定

Winform的界面数据绑定需要手动绑定,比如下面的代码:

        Model model;
        public Form1()
        {
            InitializeComponent();
            model = new Model();
            label1.DataBindings.Add("Text", model, "ID");
            ListBox lb = new ListBox();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            model.ID = DateTime.Now.ToString("mm:ss");
        }

Model的实现:

    class Model: INotifyPropertyChanged
    {
        public string ID { set; get; }
        public string Name { set; get; }
        public event PropertyChangedEventHandler PropertyChanged;
    }

实体类像wpf那样,仍然需要实现INotifyPropertyChanged,这里你可以自己去实现,也可以使用PropertyChanged.Fody这样一个AOP框架。这里我用的是Fody,也就是说如果你的Model继承了接口PropertyChanged,那么Fody就会自动帮你生成属性变更通知代码。如果你不知道怎么使用,可以参考下这个项目的git官方项目页面:https://github.com/Fody/PropertyChanged

如果你没有用Fody,那么你的Model应该这么写:

    public class Model: INotifyPropertyChanged
    {
        private string id;
        private string name;

        public string ID {
            get => id;
            set
            {
                id = value;
                OnPropertyChanged("ID");
            }
        }
        public string Name
        {
            get => name;
            set
            {
                name = value;
                OnPropertyChanged("Name");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged(string propertyName)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

当然这里有许多地方可以完善,比如做一下检查,如果没有变更,则不通知,把OnPropertyChanged放到一个父类里面,所有的model都继承这个父类。

Add方法有几个重载方法,它同时可以设置绑定格式:

label1.DataBindings.Add(
"Text",model,"Time",
updateMode:DataSourceUpdateMode.OnPropertyChanged, 
formattingEnabled: true, 
nullValue:null,formatString:"yyyy/MM");

c#里如果你在传参的时候指定了参数名,那么你的参数可以不用按照顺序填写,就像我上面的代码这样。

wpf里面可以控制绑定方向,即双向,单向等等,这里

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值