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

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

例如:

  1. 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的值,修改其表现形式,可以将上面的代码修改为

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

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

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

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

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

  1. public class Person: INotifyPropertyChanged
  2. {
  3. private string firstName;
  4. public string FirstName
  5. {
  6. get { return firstName; }
  7. set {
  8. firstName = value;
  9. SendChangedInfo();
  10. }
  11. }
  12.  
  13. private string lastName;
  14. public string LastName
  15. {
  16. get { return lastName; }
  17. set {
  18. lastName = value;
  19. SendChangedInfo();
  20. }
  21. }
  22.  
  23. private int age;
  24. public int Age
  25. {
  26. get { return age; }
  27. set {
  28. age = value;
  29. SendChangedInfo();
  30. }
  31. }
  32.  
  33. public Person(string firstName,string lastName,int age)
  34. {
  35. this.firstName = firstName;
  36. this.lastName = lastName;
  37. this.age = age;
  38. }
  39.  
  40. public event PropertyChangedEventHandler PropertyChanged;
  41.  
  42. private void SendChangedInfo([CallerMemberName] string memberName = "")
  43. {
  44. PropertyChanged?.Invoke(this,new PropertyChangedEventArgs(memberName));
  45. }
  46. }

给绑定对象实现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. 在java中使用ffmpeg将amr格式的语音转为mp3格式

    ffmpeg是一个非常强大的音视频处理工具,官网是:http://ffmpeg.org/. 由于ffmpeg在windows上和linux系统上的执行文件不一样(Windows上不需要安装ffmpeg ...

  2. AIDL--------应用之间的通信接口

    在下面例子中04Service中添加aidl包包里定义好接口 接口文件名后缀为.aidl package com.example.aidl; interface IRemoteService{ voi ...

  3. DataTableExtensions

    public static class DataTableExtensions { public static List<dynamic> ToDynamic(this DataTable ...

  4. linux,windows 可执行文件(ELF、PE)

    现在PC平台流行的可执行文件格式(Executable)主要是Windows下的PE(Portable Executable)和Linux的ELF(Executable Linkable Format ...

  5. Django之ORM数据库

    5.1 数据库的配置 1    django默认支持sqlite,mysql, oracle,postgresql数据库.  <1> sqlite django默认使用sqlite的数据库 ...

  6. db2 统计信息 runstats

    1.runstats的语法:runstats on table [模式名].[表名] with distribution and detailed indexes all注意:你可以在所有列上,或者仅 ...

  7. vue cli+axios踩坑记录+拦截器使用,代理跨域proxy(更新)

    16319 1.首先axios不支持vue.use()方式声明使用,看了所有近乎相同的axios文档都没有提到这一点建议方式 在main.js中如下声明使用 import axios from 'ax ...

  8. 用户体验要好,App动画得这么做

    以下内容由Mockplus团队翻译整理,仅供学习交流,Mockplus是更快更简单的原型设计工具.   在用户体验设计方面,App动画的设计和添加,带给设计师无限的创造空间的同时,也成为设计师群体最具 ...

  9. JSONModel简便应用

    JSONModel, Mantle 这两个开源库都是用来进行封装JSON->Model的, 想想看, 直接向服务器发起一个请求,然后回来后,就是一个Model, 直接使用, 这是一个多么美好的事 ...

  10. Unicode、UTF-8 和 ISO8859-1

    Unicode.UTF-8 和 ISO8859-1到底有什么区别 1.本文主要包括以下几个方面:编码基本知识,java,系统软件,url,工具软件等. 在下面的描述中,将以"中文" ...