是因为在学习组件开发过程中有个Bindable的属性,不明白意义,然后才接触到winform的数据绑定,想着先把数据绑定这块看一下,然后去测试下是否Bindable属性设为false,就不能绑定该属性了。数据绑定应该还是挺好用的,虽然还没有实际应用过。

在一些控件类似TextBox,Button...中有属性ControlBindingsCollection DataBindings,是一个Binding对象的集合,每一个Binding对象都是一个控件属性值与某对象属性的简单绑定,也就是说可以在集合中增加多个绑定。

例如:

personExample = new Person("wang","lantian",25);
tbFirstName.DataBindings.Add("Text",personExample,"FirstName");

personExample是Person类的对象,Person类的代码在后面会贴出来。tbFirstName 是一个TextBox对象。

现在tbFirstName的Text属性与personExample对象的FirstName建立了简单绑定。tbFirstName中Text的变化会在触发该控件的Validated时同步到personExample的FirstName,这是因为Binding的DataSourceUpdateMode属性的默认值为DataSourceUpdateMode.OnValidation。我们可以在往绑定集合中增加绑定时设置DataSourceUpdateMode的值,修改其表现形式,可以将上面的代码修改为

tbFirstName.DataBindings.Add("Text",personExample,"FirstName",false, DataSourceUpdateMode.OnPropertyChanged);

现在tbFirstName的Text内容的修改就会及时同步到personExample的FirstName。

说到现在都是控件属性的更改同步到绑定对象的修改,如果我们需要操作绑定对象来更改控件显示应该怎么办。

有一点需要注意的是,在添加绑定的时候,绑定对象的属性值会更新到控件属性。在其他时候,通过代码修改personExample的FirstName的属性值,并不能引发控件的更新,我会认为这个控件绑定是单向的,从控件属性到绑定对象内容,如果不让绑定对象实现INotifyPropertyChanged接口的话,到最后的时候我会提出我的一个疑问。

怎么实现绑定对象内容的更改同步到 控件属性呢?Person类(从园子抄过来的,嘿嘿):

public class Person: INotifyPropertyChanged
{
private string firstName;
public string FirstName
{
get { return firstName; }
set {
firstName = value;
SendChangedInfo();
}
} private string lastName;
public string LastName
{
get { return lastName; }
set {
lastName = value;
SendChangedInfo();
}
} private int age;
public int Age
{
get { return age; }
set {
age = value;
SendChangedInfo();
}
} public Person(string firstName,string lastName,int age)
{
this.firstName = firstName;
this.lastName = lastName;
this.age = age;
} public event PropertyChangedEventHandler PropertyChanged; private void SendChangedInfo([CallerMemberName] string memberName = "")
{
PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(memberName));
}
}

给绑定对象实现INotifyPropertyChanged接口并且在set属性设置器中触发事件就可以实现对绑定对象的修改引发控件属性值的修改了。

里面有个CallerMemberName,相关知识点是调用方信息。挺好用的,避免自己输入字符串了,由框架保证输入的正确性。

说一下我的疑问,在Person类不实现INotifyPropertyChanged的情况下,我将两个控件的Text属性都绑定给personExample对象的FirstName,然后一个对其中一个控件的Text属性进行修改,另一个控件的Text属性也会变化。因为在我看来这样的绑定是单向的,当其中一个控件Text改变时,personExample对象的FirstName的内容也会被同步,但是现在从FirstName到另一个控件的Text应该没有同步机制,不应该同步。因为没有看源码,所以对这点还是没想明白。如果在不实现INotifyPropertyChanged的话也有从绑定对象到控件属性的同步机制,那就可以不用去实现INotifyPropertyChanged接口。也可能是针对这种多个控件绑定到相同内容的特殊处理机制。

再复杂一点的控件数据绑定就需要使用BindingSource,BindingSource可以通过调用自身方法来实现绑定内容到控件显示的同步。这个组件像是一个隔离,将绑定对象和控件分离开来,相互访问都需要通过这个组件来实现。对这个组件不是很熟悉,等实际使用时再去学习把。

有一点需要注意的是,当我们通过修改绑定对象的内容去更新ui显示时,必须在ui线程修改,否则会出现跨线程访问控件的异常,在Debug调试下测试过。

winform中控件的简单数据绑定的更多相关文章

  1. C#中使用多线程访问Winform中控件的若干问题

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial  ...

  2. (转)c#(wince)中使用多线程访问winform中控件的问题

    我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法:  public partial ...

  3. c#中解决winform中控件不能输入汉字的办法

    设置控件的ImeMode属性 如:    textBox.ImeMode = System.Windows.Forms.ImeMode.On; 其中枚举有如下值:

  4. WinForm中控件位置不随窗体大小的变化而改变

    背景:在窗体开发中使控件的位置不随窗体的大小改变而变化的问题?这是一个同事在开发时遇到的问题,在思考试错之后,写出如下代码. 声明成员: Point m_InitLocation; Size m_In ...

  5. 控制winform中控件的输入格式

    private void txtNum1_KeyPress(object sender, KeyPressEventArgs e) { ') && e.KeyChar != '\r' ...

  6. C#实现WinForm DataGridView控件支持叠加数据绑定

    我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...

  7. WinForm控件复杂数据绑定常用数据源(对Combobox,DataGridView等控件DataSource赋值的多种方法)

    开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1) 简单数据绑定 简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性.采用如下形式进行绑定 ...

  8. Android Design Support Library 中控件的使用简单介绍(一)

    Android Design Support Library 中控件的使用简单介绍(一) 介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件!最低支持 Android ...

  9. WinForm控件选择器

    jQuery和Css的控件选择器用起来非常畅快,相信用过的人都会有这种感觉,而WinForm则是通过Name来实现窗体中控件的选择,在选择单个控件的时候是很方便,但是当选择具有一类特征的控件时,则显得 ...

随机推荐

  1. 安装Ubuntu后一些准备

    一些基础 安装的时候,先不选镜像就可以避开简易安装. 更改root密码:sudo passwd root 更改源,更新,不行就打断在更新 安装vim 改为unity模式,安装VMware Tools, ...

  2. 给出一个十六进制的数0xFF 0x80 (只有2“位”) 将其转换成有符号的一字节的十进制整数

    #include <stdio.h>#include<iostream>#include <stdlib.h>#include<string.h>usi ...

  3. 对象之int介绍

    #Auther Bob #--*--conding:utf-8 --*-- #创建两个int的对象,age1和age2 age1 = 10 age2 = int(1) #查看对象的类 print(ty ...

  4. php SESSON共享 (mysql方式)

    为什么要进行session共享? 因为一些大型网站,通常会有很多服务器,每个服务器运行不同的业务模块,并使用二级域名(或是完全不同的域名),而用户系统是统一的,通过登陆名.密码来登陆各模块.用户数据放 ...

  5. SSH三大框架的关系、使用到的jar包、配置文件图解

  6. Java数据结构和算法(七)B+ 树

    Java数据结构和算法(七)B+ 树 数据结构与算法目录(https://www.cnblogs.com/binarylei/p/10115867.html) 我们都知道二叉查找树的查找的时间复杂度是 ...

  7. 7.11 cookie 失效后 ,重新登陆 页面 可能跳出 框架 ,只剩主题 部分 ,

    判断地址 不在  框架里  (项目  地址栏一般 都是 首页地址 ) function url(){ var page=getpage(); if(window==top&&(page ...

  8. ubuntu 'yuan' update

    #  tsinghua  university deb http://mirrors.aliyun.com/ubuntu/ trusty main restricted universe multiv ...

  9. 让QQ好友现形

    方法一 现在使用QQ的朋友,越来越注重保护自己的个人信息,如果对方将个人资料设置为保密你就无法看到对方的资料了,而这位好友如果又有着不断变换昵称的不良习惯,那么随着QQ好友名单的不断增加,时间一长,你 ...

  10. python数据类型4

    一浮点数 什么叫做浮点数:浮点数就相当于小数,但是浮点数不包括无限循环又不重复的小数. 小数分为 有限小数和无限小数 无限小数又分为 无限循环小数和无限不循环小数 而 浮点数就是有限小数和无限循环小数 ...