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来实现窗体中控件的选择,在选择单个控件的时候是很方便,但是当选择具有一类特征的控件时,则显得 ...
随机推荐
- ES5之defineProperty
一 概述 Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. 对象里目前存在的属性描述符有两种主要形式:数据描述符和存 ...
- 使用VisualSVN Server搭建SVN服务器[xyytit]
使用 VisualSVN Server来实现主要的 SVN功能则要比使用原始的 SVN和 Apache相配合来实现源代码的 SVN管理简单的多,上手也没有那么复杂. 下面就看看详细的说明 Visual ...
- C# 发送电子邮件(含附件)用到的类 system.web.mail
主要是用到了System.Web.Mail命名空间,用到了此空间的三个类,分别是: ●MailMessage类,用于构造电子邮件●MailAttachment类,用于构造电子邮件附件●SmtpMail ...
- 'WebElement' object is not iterable
checkbox.html源码: <html> <head> <meta http-equiv="content-type" content=&quo ...
- VMware下centos7安装VMware Tools
右键虚拟机设置,找到CD/DVD,选择使用ISO映像文件,在VMware安装目录下找到linux.iso. 挂载iso文件 > mount -t auto /dev/cdrom /mnt/c ...
- cookie、session、token区分
https://www.cnblogs.com/moyand/p/9047978.html http://www.cnblogs.com/JamesWang1993/p/8593494.html Co ...
- p3412 [POI2005]SKO-Knights
传送门 分析 图1 我们假设我们现在有两个向量(2,3)和(4,2),将他们所能到达的点在几何画板上画出来,再将这些点用红线连起来,在将横坐标相同的点用蓝线连起来便能得到图1,就此我们可以发现可以用绿 ...
- git保护进程
https://github.com/Mattiwatti/PPLKiller 去掉进程保护内核级
- Android 控制ScrollView滚动到底部或顶部
在开发中,我们经常需要更新列表,并将列表拉倒最底部,比如发表微博,聊天界面等等, 这里有两种办法,第一种,使用scrollTo(): public static void scrollToBottom ...
- 关于使用smsx.cab控件做web打印使用方法(转)
注意:在使用之前先告诉下我的痛苦经历 在做WEB项目是我的JSP页面在jsp文件夹里,我把smsx.cab放在js文件夹里(jsp和js是用级别目录) 在本机上测试可以正确下载控件,但是部署到测试服务 ...