WPF 神话之Binding对象.docx
- 文档编号:8764825
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:10
- 大小:21.22KB
WPF 神话之Binding对象.docx
《WPF 神话之Binding对象.docx》由会员分享,可在线阅读,更多相关《WPF 神话之Binding对象.docx(10页珍藏版)》请在冰豆网上搜索。
WPF神话之Binding对象
WPF神话之Binding对象一
这里的Binding从字面上的意思就是数据绑定。
今天我不想写太多的东西。
因为今晚还有许多东西要做。
所以今天就一起探讨一个问题——Binding的使用问题。
第一点:
Binding可以称作为数据的管道。
两头分别是数据源,数据对象。
也就是Source--->Target.源和对象
之间有时候可以使单向的,有时候可以使双向的。
这里的设定可以使用Mode对象。
他是一个枚举。
有四个属性值。
大家可以查看相关文档。
在接下来的例子中,我们也会看到。
第二点:
Binding对象。
也就是说。
我们把我的一个源中的什么属性交给Target。
我们可以设置Binding中的Path
来告诉我们的程序。
我们是把那个对象给我们的Target。
第三点:
在第一点中我们说过,Binding可以使双向的。
那么数据改变的时候。
在什么场合会进行更新源。
或者
更新Target了。
这里又要牵扯到一个新的东西就是触发器。
通过设置UpdateSourceTrigger这个属性来设定触发的
时机。
以上都是些无聊的说明性东西。
只是让大家知道,我们接下来的例子中要用到什么知识点。
好了。
我们看第一个例子(因为上传图片比较麻烦,所以这里我就不上传图片了。
感兴趣的可以把代码照抄一遍
自己去试验下,我觉得这样印象更好)
我们来看下面的一个例子:
我先来说说这里例子要做什么,这个例子是这样的。
在窗口上一个文本框,一个按钮。
文本框呈现的是一个对象
的某个属性。
点击按钮,改变文本的绑定源的数据。
同时更新文本信息。
大家看了这点,一定觉得这个很好实现。
我们只要把源拿到,更改后,重新赋给我们的控件就好了。
这个是可行
的,但不是我们今天要说的。
好了我们来分析下。
第一个需求很简单。
只是把某个对象给控件。
但是第二个需求了?
首先要知道我们的Binding是很智能的。
只要源
的数据一旦发生了改变。
目标显示也会改变。
怎么来改变了,肯定有个事件去监听着,我们的源数据。
那么这个监
听是什么了,我们要如何来写了。
请看我定义的一个类:
namespaceWpfBinding
{
/*
*1、首先使用属性通知接口(INoticePropertyChanged)
*2、该接口中只有一个事件属性
*3、在属性改变的Set方法中,调用该事件方法,参数有两个,第一个是发生的类,第二个是属性名
*/
publicclassStudent:
INotifyPropertyChanged
{
#regionINotifyPropertyChanged成员
//通过这个事件,我们就能很好控制我们的属性了变更了。
publiceventPropertyChangedEventHandlerPropertyChanged;
#endregion
privatestringname;
publicstringName
{
get{
returnthis.name;
}
set{
this.name=value;
if(this.PropertyChanged!
=null){
//只要属性发生改变。
就会通知我们的目标。
目标也同样更新
this.PropertyChanged.Invoke(this,newPropertyChangedEventArgs("Name"));
}
}
}
}
}
好。
我们来应用:
界面设计很简单:
Name="txtStuName"/> 只有一个空间一个按钮。 在后台文件中我们来做数据的绑定: 为了方便说明,我们定义一个全局的Student对象,变量名为stu. 在窗体构造函数里面,我们来看看如果做数据绑定。 /* *使用Binding来实现数据绑定。 *1、声明数据源。 这里就是我们的Student类了。 *2、声明Binding对象。 *3、把Binding对象的数据源和我们Student关联起来 *4、指定绑定的访问路径,也就是要绑定的属性了 *5、让绑定的数据同我们的UI关联起来。 */ stu=newStudent(); stu.Name="我是"; /*第一种绑定的方法(这个看起来代码有点多啊。 还有简单的方法我们来看看这种方式) Bindingbind=newBinding();//申明一个Binding对象 bind.Source=stu;//我们的数据源就是我们Student实例。 这里是制定源 bind.Path=newPropertyPath("Name");//这里是制定要绑定源中的那个属性 BindingOperations.SetBinding(this.txtStuName,TextBox.TextProperty,bind);//这里是让我们的源和Target关联起来 */ //第二种绑定的方法这个很简洁。 我就不说明了。 和上面其实是一样的。 this.txtStuName.SetBinding(TextBox.TextProperty,newBinding("Name"){Source=stu}); 上面就是数据绑定完毕了。 下面我们来看看按钮里面我们做了什么 privatevoidButton_Click(objectsender,RoutedEventArgse) { stu.Name=stu.Name+"Tom"; } 其他什么也没有做。 当我们运行起来,点击按钮,我们的文本框就变成"我是Tom";这里是不是很神奇。 大家可以去试验下。 下面的这个例子是为了验证数据绑定是双向的。 试验是这样的。 在窗体上有个文本框,滑块。 滑动滑块,文本中数据会改变。 我们改变文本框的数据,滑块也会改变。 相信大家 在脑海里面有一个印象了。 我们直接看代码的实现: 首先看XAML文件的布局。 也很简单。 一个TextBox,一个Slider。 我的注释写的都很清楚哦。 -- 把控件作为Binding的源来实现数据绑定 1、在显示的属性中使用Binding形式如下: {BindingPath=Value,ElementName=控件名} 2、这里的Path指代要数据源的属性 3、这里的实现有几种形式: A、利用Binding的扩展方法。 如: {BindingPath=Value,ElementName=silder} B、利用Binding的构造方法。 其可以直接接受一个Path参数如: {BindingValue,ElementName=silder} C、后台使用代码来实现如: this.txtSilder.SetBinding(TextBox.TextProperty,newBinding("Value"){ElementName="silder"}); 在这里,因为在cs中,我们可以直接访问控件。 所以我们可以不使用ElementName来进行banding。 可以这样来写: this.txtSilder.SetBinding(TextBox.TextProperty,newBinding("Value"){Source=this.silder}); 4、关于Binding还有几种属性: 1、BindingMode.(TwoWay,OneWay,OnTime,OneWayToSource和Default)即更新模式 2、UpdateSourceTrigger: (PropertyChnaged,LostFocus,Explicit,Default) --> Name="txtSilder"> Name="silder"> 看了注释我们应该知道有很多种Binding方法了。 这几种方法我都试过。 所以现在保留下来的文件时使用最后一个方法。 后台大家也知道什么方法了啊。 就是: //采用控件作为另一个控件的数据源 this.txtSilder.SetBinding(TextBox.TextProperty,newBinding("Value"){Source=this.silder, UpdateSourceTrigger=UpdateSourceTrigger.PropertyChanged}); 其他什么代码就没有了。 就是这么简单。 大家去试验下。 今天我们来探讨的问题,有两个: 一是: 关于Binding的几个属性问题(Path,Source)二是: 关于几种数据源问题。 首先来看第一个问题: 第一个属性: Source: 这个数据源有很多种,在接下来我会大家提供几个数据源的例子信息。 第二个属性: Path,这里将要重点介绍这个属性 在XAML文件中写Binding的时候。 这里的Path是可以不用写的。 比如说: 这句话是说Binding一个数据源中的Age属性。 这里的Path我是省略掉的。 这种写法大家要习惯。 再来看一种特殊情况。 Path采用.来使用的类型。 我们来看看这样的一个小例子。 Class="WpfBinding.MainWindow" xmlns=" xmlns: x=" xmlns: sys="clr-namespace: System;assembly=mscorlib"//这里我们使用了资源。 所以要引用这个命名空间,请注意了。 Title="MainWindow"Height="800"Width="800"> --定义资源--> Stringx: Key="myResource"> 菩提本无树,明镜亦非台。 本来无一物,何处惹尘埃。 String> -- 没有Path的Binding. 1、如果一个数据源本来就是数据,如string,int等。 我们可以不用指定Path. 2、如我们下面的写法 --> Name="txtMsg"TextWrapping="Wrap"Text="{BindingPath=.,Source={StaticResourceResourceKey=myResource}}"Margin="5"Background="LightBlue"/> 这个例子的呈现效果就是。 我们看到了资源的信息。 会显示出来。 这里的Binding我们还可以写成这样{Binding.,Source={StaticResourceResourceKey=myResource}}或者{BindingSource={StaticResourceResourceKey=myResource}} 接下来我们来探讨第二个问题。 关于数据源的问题。 1.DataContext这个属性是被定义在FrameworkElement类中的,而这个类是WPF控件的一个基类。 所以我们WPF控件都有这个属性。 如果我们在WPF中的某个控件上设置了Path属性,但是没有给定其的Source属性的话。 WPF会自动在该控件树上向上查找。 把第一个找到的DataContext作为自己的数据源。 2、集合作为数据源的例子。 代码清单如下: XAML: Class="WpfBinding.MainWindow" xmlns=" xmlns: x=" xmlns: sys="clr-namespace: System;assembly=mscorlib" Title="MainWindow"Height="800"Width="800"> --DataSource的指定这里采用Grid来做布局--> Name="txtStudentID"BorderBrush="Black"Margin="2"> Name="lstStudent"BorderBrush="Black"Height="100"Grid.Row="2"> --使用模版来进行数据banding--> 来看看后台代码 在后台的初始化中添加这段代码。 这里有个Member类。 该类里面就两个属性。 一个是Id,一个是Name.请各位自己添加一个类就好。 List newMember("0001","wy"), newMember("0002","love"), newMember("0003","hu"), newMember("0004","bing"), newMember("0001","wy") }; this.lstStudent.ItemsSource=lstMember;//这里是将我们的数据源给我们的ListBox。 关于这点大家应该都很清楚。 winform大家应该接触过。 //this.lstStudent.DisplayMemberPath="Name"; //主要来看这段代码。 这段代码的意思是 //把我们的ListBox作为我们的数据源。 目标是我们的文本框。 //绑定的对象属性是该数据源中的Id,这里是用的SelectedItem.Id //也就是说选中行的Id.从这里我们就清楚了,这个例子不但进行了数据banding。 而且还进行选中行的数据Id同其他控件进行关联 //请大家运行下代码看看效果。 Bindingbind=newBinding("SelectedItem.Id"){Source=this.lstStudent}; this.txtStudentID.SetBinding(TextBox.TextProperty,bind); 3.我们再来看另外几个数据源的情况。 XAML: Class="WpfBinding.BindingWin" xmlns=" xmlns: x=" Title="BindingWin"Height="600"Width="600"> Name="lvStudent"Height="200"> Name="btnFromDataTable"Content="从DataTable获取数据"Click="btnFromList_Click"Width="150"> Name="btnFromXml"Content="从XML中获取数据"Click="btnFromList_Click"Width="150"> Name="btnObjectDataProvider"Content="ObjectDataProvider"Click="ObjectDataProvider_Click"Width="130"> 这几个例子会用到一个辅助类 publicclassMyStudent{ publicstringID{get;set;} publicstringStuName{get;set;} publicintAge{get;set;} publicMyStudent(stringid,stringname,intage) { this.ID=id; this.StuName=name; this.Age=age; } publicMyStudent() { //TODO: Completememberinitialization } } A.来看看DataTable作为数据源的例子 在按钮btnFromDataTable事件中添加如下代码 DataTabledt=newDataTable(); dt.Columns.Add("ID",typeof(string)); dt.Columns.Add("Name",typeof(string)); dt.Columns.Add("Age",typeof(int)); DataRowrow1=dt.NewRow(); row1["ID"]="0001"; row1["Name"]="Wy"; row1["Age"]=25; DataRowrow2=dt.NewRow(); row2["ID"]="0002"; row2["Name"]="Test121"; row2["Age"]=24; DataRowrow3=dt.NewRow(); row3["ID"]="0003"; row3["Name"]="Info001"; row3["Age"]=25; dt.Rows.Add(row1); dt.Rows.Add(row2); dt.Rows.Add(row3); //记住这里一定要用DefaultView.请大家注意了。 大家可以试验下直接把dt赋值过去的效果。 this.lvStudent.ItemsSource=dt.DefaultView; /* 以上还有一种写法 this.lvStudent.DataContext=dt; this.lvStudent.SetBinding(ListView.ItemSourceProperty,NewBinding()); 使用这种方法。 Binding会自动找到DefaultView */ B.使用XML文件作为数据源的形式我这里有个XML文件。 我是放在编译目录下的。 也就是和我们生成的exe文件在同一个目录。 xmlversion="1.0"encoding="utf-8"? > 后台的代码如下: //首先是加载我们的XML文件的内容,然后将这个XDocument文件进行数据的提取 XDocumentdoc=XDocument.Load(System.AppDomain.CurrentDomain.BaseDirectory+"Xml.xml"); this.lvStudent.ItemsSource=fromelementindoc.Descendants("Student")//寻找Student节点 selectnewMyStudent(){ ID=element.Attribute("Id").Value, StuName=element.Attribute("Name").Value, Age=Convert.ToInt32(element.Attribute("Age").Value) }; 这里大家可以尝试着试验下。 还有一种加载XML文件的方式
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WPF 神话之Binding对象 神话 Binding 对象