Winform控件数据绑定 DataBindings

目录

引言

 绑定的方式

        双向绑定

                验证时更改数据源

                立即更改数据源

        单向绑定

绑定方法

        属性界面选择绑定

        通过代码手动绑定

绑定自定义数据类型


引言

DataBindings 的出现显然是为了解决后台数据与前端界面的同步问题,通过绑定控件属性与对象属性,解决二者的同步问题。下图演示的是双向绑定的情景:

借助这种便利,还可自动完成数值与文本之间的自动转换。

 绑定的方式

        双向绑定

                验证时更改数据源

数据源更新模式:OnValidation

引言所演示的就是验证时更新数据源,在textbox控件失去焦点时,触发Onvalidation事件,继而更改TrackBar控件value属性。默认模式

                立即更改数据源

数据源更新模式:OnPropertyChanged

 在我修改textbox控件值时,会立即修改TrackBar控件value值

        单向绑定

数据源更新模式:Never

修改Textbox值时,TrackBar控件value属性不会更改。

绑定方法

        属性界面选择绑定

                

可绑定的属性会列在DataBindings列表下面,选择Text后,首先先添加项目数据源。我们绑定的是类对象,这里选择对象数据。

 接着选择数据对象,从自定义类库或系统类库中选择程序集,这里我们绑定的系统程序集,把隐藏系统程序集取消勾选,选择TrackBar控件。

 

 我已经添加过绑定了,所以最后会出现两个Source,选择其中一个即可。设计器下方会自动添加一个BindingSource控件。到此已完成实例控件属性到类属性的绑定,我们还需要给这个绑定对象赋实例对象。我们在代码中给其赋值即可实现二个对象的绑定。

        通过代码手动绑定

我们看一下设计器自动生成代码

this.components = new System.ComponentModel.Container();
this.label1 = new System.Windows.Forms.Label();
this.trackBar1 = new System.Windows.Forms.TrackBar();
this.textBox1 = new System.Windows.Forms.TextBox();
this.trackBarBindingSource = new System.Windows.Forms.BindingSource(this.components);

this.label1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.trackBarBindingSource, "Value", true));

this.textBox1.DataBindings.Add(new System.Windows.Forms.Binding("Text", this.trackBarBindingSource, "Value", true));

 DataBindings.Add方法有6个重载。分别是:属性名、数据源、数据成员、格式化使能、数据源更新模式、数据源为空时的默认值。因此,我们可以这样写:

private void Form1_Load(object sender, EventArgs e)
{
     BindingSource source = new BindingSource();
     source.DataSource = this.trackBar1;
     this.textBox1.DataBindings.Add("Text", source, "Value");
     this.label1.DataBindings.Add("Text", source, "Value");
}

默认的数据源更新模式:验证后更新。

绑定自定义数据类型

现在我们自定义一个类,类拥有属性Value

public class MyClass
    {
        public int Value { get; set; }
    }

更改一下绑定代码:

        MyClass mycls = new MyClass();
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            BindingSource source = new BindingSource();
            source.DataSource = mycls;
//为了使现象更明显,使用立即更新模式
            this.trackBar1.DataBindings.Add("Value", source, "Value",true,DataSourceUpdateMode.OnPropertyChanged);
            this.textBox1.DataBindings.Add("Text", source, "Value", true, DataSourceUpdateMode.OnPropertyChanged);
            this.label1.DataBindings.Add("Text", source, "Value", true, DataSourceUpdateMode.OnPropertyChanged);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            //断点
        }

 可见,对控件的修改可以实时反馈到类对象上。但当我们修改类对象属性时,控件在这时不会更改,如果想要类属性修改是可以实时反馈到控件上,我们需要实现 INotifyPropertyChanged接口。

    public class MyClass:INotifyPropertyChanged
    {
        private int _value;

        public int Value
        {
            get => _value;
            set
            {
                _value = value;
                OnPropertyChanged();
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }

  • 3
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

James.TCG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值