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来实现窗体中控件的选择,在选择单个控件的时候是很方便,但是当选择具有一类特征的控件时,则显得 ...
随机推荐
- 归并排序/合并排序c++实现
#include <iostream>#include<string.h> using namespace std;class merges{public:void merge ...
- 把System.Drawing.Image对象img,在页面的Image控件上显示出来
1.保存到本地,然后调用. //定义文件名 string iname = DateTime.Now.ToString("yyMMddhhmmss"); //保存到服务器,b是 ...
- Collections.shuffle()源码分析
Java.util.Collections类下有一个静态的shuffle()方法,如下: 1)static void shuffle(List<?> list) 使用默认随机源对列表进行 ...
- 坑爹的HP
昨天晚上帮人远程修理电脑,情况是这样的: HP CQ45笔记本, 比较老的机器, win32 xp sp3 系统, 突然发现没有声音了,而且右下角也没有出现小喇叭图标. 处理过程: 1.先查看了控制面 ...
- StringUtils学习
commons-lang3-3.5.jar
- Linux下Google Test (GTest)测试环境搭建步骤
1.下载GTEST 下载链接为:https://code.google.com/p/googletest/downloads/list 目前GTEST的最新版本为gtest-1.7.0.zip,因此我 ...
- maven 发布打包部署 命令
一.配置好jdk 二.下载安装maven http://maven.apache.org/download.cgi 三.添加环境变量 1. 添加 M2_HOME 和 MAVEN_HOME 环境变量到 ...
- 谈谈我对Ui设计师的一些观点
做ui设计师3年多了,对ui设计师在工作中也了解了许多. 作为UI设计师,在工作中需要清楚了解设计的目的,尤其是你做的不是大众化产品,不能以个人认知.很强的主题性来确定. 例如针对儿童人群的app时, ...
- Oracle sql的基本优化写法和思路。
首先简单介绍下常规的sql优化的方式: 1.肯定有人说建索引啊. 2.数据量实在太大,建分区啊. 3.其实基于目前公司的业务还有一种办法那就是向上聚集表.根据查询业务,专门抽取上来一张表,直接做到se ...
- IC向管理者角色转换
1. 虽然你认为自己已经想明白怎么干,但还是从怎么干回归到要解决的问题,抛给正确的人(应该对这些问题负责的人),引导他们想出问题的答案. 给别人机会和空间,帮助他们成长: 人们对自己“想”出的方案更有 ...