winform中控件的简单数据绑定
是因为在学习组件开发过程中有个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中控件的简单数据绑定的更多相关文章
- C#中使用多线程访问Winform中控件的若干问题
我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...
- (转)c#(wince)中使用多线程访问winform中控件的问题
我们在做winform应用的时候,大部分情况下都会碰到使用多线程控制界面上控件信息的问题.然而我们并不能用传统方法来做这个问题,下面我将详细的介绍. 首先来看传统方法: public partial ...
- c#中解决winform中控件不能输入汉字的办法
设置控件的ImeMode属性 如: textBox.ImeMode = System.Windows.Forms.ImeMode.On; 其中枚举有如下值:
- WinForm中控件位置不随窗体大小的变化而改变
背景:在窗体开发中使控件的位置不随窗体的大小改变而变化的问题?这是一个同事在开发时遇到的问题,在思考试错之后,写出如下代码. 声明成员: Point m_InitLocation; Size m_In ...
- 控制winform中控件的输入格式
private void txtNum1_KeyPress(object sender, KeyPressEventArgs e) { ') && e.KeyChar != '\r' ...
- C#实现WinForm DataGridView控件支持叠加数据绑定
我们都知道WinForm DataGridView控件支持数据绑定,使用方法很简单,只需将DataSource属性指定到相应的数据源即可,但需注意数据源必须支持IListSource类型,这里说的是支 ...
- WinForm控件复杂数据绑定常用数据源(对Combobox,DataGridView等控件DataSource赋值的多种方法)
开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1) 简单数据绑定 简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性.采用如下形式进行绑定 ...
- Android Design Support Library 中控件的使用简单介绍(一)
Android Design Support Library 中控件的使用简单介绍(一) 介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件!最低支持 Android ...
- WinForm控件选择器
jQuery和Css的控件选择器用起来非常畅快,相信用过的人都会有这种感觉,而WinForm则是通过Name来实现窗体中控件的选择,在选择单个控件的时候是很方便,但是当选择具有一类特征的控件时,则显得 ...
随机推荐
- mongo嗅探器mongosniff
mongo嗅探器 在更高版本被mongoreplay取代. 安装: 在Ubuntu直接apt-get install mongodb即包含有. 使用方法 直接--help查看使用方法,一般使用: mo ...
- js variable 变量
局部作用域 由于JavaScript的变量作用域实际上是函数内部,我们在for循环等语句块中是无法定义具有局部作用域的变量的: 'use strict'; function foo() { for ( ...
- php在线支付流程
1.企业与银行的两种接入方式: (1).企业直接与银行对接. 优点:直接与银行进行财务结算,资金安全,适合资金流较大企业. 缺点:开发和维护工作量较大,分别与每家银行签订合同,每年需交 ...
- discuz的css处理机制
common/common.css 是一个通用的css文件. common/module.css 是某个功能模块使用的css文件. module.css中,利用特殊语法: /** 标识 **/ c ...
- Halcon的C#二次开发及经验分享
本文涉及面较广,因此很难在所有方面都讲解得很详细,故适合具有一定Halcon开发经验的人阅读. 1.Halcon二次开发的两种方式 ① 使用C#的语法方式逐句改写Halcon代码 优点:各种变量的类型 ...
- inline 引起undefined reference to
main.cc:57: undefined reference to `evpp::udp::UdpDecoder::GetHeader()'collect2: error: ld returned ...
- Autotest Weekly Report
Autotest Weekly Report Reported by: 12/16/2013 What I Did Last Week Debug autotest scripts of ‘smart ...
- OSGi 系列(十四)之 Event Admin Service
OSGi 系列(十四)之 Event Admin Service OSGi 的 Event Admin 服务规范提供了开发者基于发布/订阅模型,通过事件机制实现 Bundle 间协作的标准通讯方式. ...
- VS2010 MFC对话框程序用CButtonST给按钮添加图标
也许是VS版本的关系,CButtonST中的BCMenu两个文件是无法编译通过的. 1.拷贝下载的CButtonST(我下载的v3.9)中的BtnST.h和BtnST.cpp文件到自己项目目录下. ...
- 基于beego orm 针对oracle定制
目前golang的ORM对oracle支持都没有mysql那样完整,一个orm要同时兼容mysql和oracle由于在sql语法上区别,会使整orm变的非常臃肿. 本项目是在beego orm上修改, ...