Winform使用DataBinding实现数据绑定

本文介绍了一种使用DataBinding技术简化界面更新的方法。通过绑定模型属性到界面控件,当模型数据变化时,界面自动更新,避免了手动赋值的繁琐。示例代码展示了如何在C#中实现这一功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有的项目界面多个地方使用到模型的同一个属性,不使用数据绑定功能时,每当添加或修改一些功能时,都要手动赋值更新界面,总是担心哪里漏掉没有更新。

使用DataBinding可以实现自动绑定,当模型数据改变时,界面上绑定了模型属性的控件将自动更新,不需要手动一一赋值。

代码如下(注意代码中用的是Form2不是Form1):

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;
using System.Runtime.CompilerServices;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        Test test;
        private void Form2_Load(object sender, EventArgs e)
        {
            test=new Test();
            label1.DataBindings.Add("Text", test, "Str");
            label2.DataBindings.Add("Text", test, "Str");
            label3.DataBindings.Add("Text", test, "Str");
            
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            test.Str = textBox1.Text;
        }

    }

    //要使用绑定数据功能,需要模型支持INotifyPropertyChanged接口
    public class Test : INotifyPropertyChanged
    {
        string _str;
        public string Str
        {
            get
            {
                return _str;
            }
            set
            {
                _str = value;
                FireStrChanged();
            }
        }

        //必须实现INotifyPropertyChanged接口的此事件
        public event PropertyChangedEventHandler PropertyChanged;

        //要在.net4.0使用CallerMemberName特性,需要加上后面一段代码
        public void FireStrChanged([CallerMemberName] string propertyName="")
        {
            PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }

    }
}

namespace System.Runtime.CompilerServices
{
    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
    public class CallerMemberNameAttribute : Attribute
    {

    }

    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
    public class CallerFilePathAttribute : Attribute
    {

    }

    [AttributeUsage(AttributeTargets.Parameter, Inherited = false)]
    public class CallerLineNumberAttribute : Attribute
    {

    }
}

________________________

2023.1.23更新,更简洁的写法,实现效果一样

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;
using System.Runtime.CompilerServices;

namespace WindowsFormsApplication1
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        Test test;
        private void Form2_Load(object sender, EventArgs e)
        {
            test=new Test();
            label1.DataBindings.Add("Text", test, "Str");
            label2.DataBindings.Add("Text", test, "Str");
            label3.DataBindings.Add("Text", test, "Str");
            
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            test.Str = textBox1.Text;
        }

    }

    //要使用绑定数据功能,需要模型支持INotifyPropertyChanged接口
    public class Test : INotifyPropertyChanged
    {
        string _str;
        public string Str
        {
            get
            {
                return _str;
            }
            set
            {
                _str = value;
                //FireStrChanged();
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Str)));
            }
        }

        //必须实现INotifyPropertyChanged接口的此事件
        public event PropertyChangedEventHandler PropertyChanged;

        //要在.net4.0使用CallerMemberName特性,需要加上后面一段代码
        //public void FireStrChanged([CallerMemberName] string propertyName="")
        //{
        //    PropertyChanged.Invoke(this, new PropertyChangedEventArgs(propertyName));
        //}

    }
}

________________________

实现效果:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值