第9章 数据绑定
9.1 数据绑定基本概念
WPF提供了三种数据绑定技术:Binding、MultiBinding、PriorityBinding
这三种Binding的基类都是BindingBase,而BindingBase又继承于MarkupExtension
在WPF中,ContentControl(如Button)和ItemsControl(如ListBox和ListView)都提供了内置的功能,使单个数据项或数据项集合可以进行灵活的数据绑定,并可以生成排序、筛选和分组后的视图
System.Windows.Data.Binding类:
将**“目标”的附加属性与数据“源”的属性**绑定在一起,数据源可以是任何修饰符为public的属性
绑定语法:
<object property="{Binding declaration}" .../>
//object为绑定目标;declaration为绑定声明,如果有多个绑定声明,各绑定声明之间用逗号分隔
<Slider Name="slide1" Maximum="100" />
<TextBlock Text="{Binding ElementName=slide1,Path=Value}" />
9.1.1 绑定和绑定表达式
绑定是指将“目标”的依赖性属性绑定到“源”的CLR属性
BindingExpression是维持绑定源与绑定目标之间连接的基础对象,一个Binding实例中可包含多个BindingExpression实例
9.1.2 绑定模式(Mode属性)
1、OneWay:单向绑定
特点:当源发生变化时目标也自动变化,适用于绑定的控件为隐式只读控件的情况(如学号),或者目标属性没有用于进行更改的控件接口的情况(如表的背景色)
<TextBlock
Text="{Binding ElementName=listBox1,
Path=SelectedItem.Content, Mode=OneWay}"/>
2、TwoWay:双向绑定
特点:当源或目标有一方发生变化时,另一方也自动变化,适用于可编辑或交互式的UI方案
<TextBox Text="{Binding ElementName=listBox2,
Path=SelectedItem.Content,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
3、OneTime:单次绑定
特点:当应用程序启动或数据上下文(DataContext)发生更改时才更新目标,此后源的变化不再影响目标,适用于绑定静态的数据,它实质上是OneWay绑定的简化形式
<TextBox Text="{Binding ElementName=listBox3,
Path=SelectedItem.Content,
Mode=OneTime}" />
4、OneWayToSource:反向绑定
特点:当目标发生变化时源也跟着变化,这种方式与OneWay绑定刚好相反
<TextBox Text="{Binding ElementName=listBox4,
Path=SelectedItem.Content,
Mode=OneWayToSource,
UpdateSourceTrigger=PropertyChanged}" />
5、Default:自动获取目标属性的默认Mode值
如果不声明绑定模式,默认为Default,般情况下,可编辑控件属性(如文本框和复选框的属性)默认为双向绑定,而多数其他属性默认为单向绑定
<TextBox Text="{Binding ElementName=listBox2,
Path=SelectedItem.Content,
Mode=Default,
UpdateSourceTrigger=LostFocus}" />
9.1.3 控制更新源的时间(UpdateSourceTrigger)
-
Explicit:用C#代码调用BindingExpression的UpdateSource方法时才更新源
-
LostFocus:当目标控件失去焦点时自动更新源
-
PropertyChanged:目标控件的绑定属性每次发生更改时都会自动更新源
<TextBox Text="{Binding ElementName=listBox2,
Path=SelectedItem.Content,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" />
9.1.4 绑定路径语法(Path属性)
(1)Path的值为源对象的属性名(常用,本章例子)
(2)Path值的其他情况:
(a)当绑定到附加属性时,需要用圆括号将其括起来
(b)用方括号指定属性索引器,还可以使用嵌套的索引器。
(c)在索引器内部,可以使用多个由逗号分隔的索引器参数,还可以使用圆括号指定每个参数的类型
(d)如果源为集合视图,则可以用斜杠(/)指定当前项
(e)可以使用点(.)路径绑定到当前源
9.1.5 数据转换
用XAML描述数据绑定时,WPF提供的类型转换器能将一些类型的值转换为字符串表示形式。但在有些情况下,可能需要开发人员自定义转换器
例如,当绑定的源对象是类型为DateTime的属性,在这种情况下,为了使绑定正常工作,需要先将该属性值转换为自定义的字符串表示形式
要将转换器与绑定关联,一般先创建一个实现IValueConverter接口的类,然后实现两个方法:Convert方法和ConvertBack方法
9.2 简单数据绑定
9.2.1 在单个属性中直接指定绑定源
ElementName:源是另一个WPF元素
<Slider Name="slide1" Width="100" Maximum="100" />
<Rectangle Width="{Binding ElementName=slide1,Path=Value}" Height="15" Fill="Red" />
Souce:源是一个CLR对象
<Page …… xmlns:src="clr-namespace:ch11.Examples">
<TextBlock Text="{Binding XueHao,
Source={StaticResource info}}" />
用Source绑定到CLR对象
Binding类的Source属性表示绑定的数据源为CLR对象,该CLR对象既可以是.NET框架提供的类的实例,也可以是自定义类的实例
用RelativeSource绑定相对目标
RelativeSource:源和目标是同一个元素
RelativeSource表示“源”是自身。当将对象的某个属性绑定到它自身的另一个属性,或者在样式(Style)或模板(ControlTemplate)中使用数据绑定时,RelativeSource属性很有用
<Rectangle Width="100"
Height="{Binding RelativeSource={RelativeSource Self},
Path=Width}" />
9.2.2 通过DataContext将多个属性绑定到相同的源
(1)只需要在父元素上用DataContext声明一次
(2)每个子元素的“Bingding Path=…”都可以省略为: “Bingding …”
第10章 数据库与实体数据模型
10.1 创建数据库和表
10.1.1 ADO.NET数据访问技术
1、利用DataSet访问数据库
这是ADO.NET刚推出时提供的技术,用于在断开连接方式下对数据进行处理,该技术将驻留在本机内存中的DataSet作为中间层,即应用程序和DataSet进行交互,DataSet再和数据库进行交互
2、利用LINQ to DataSet访问数据库
采用这种方式时,应用程序可以使用LINQ语法访问DataSet,用法比第一种方式更灵活,也更简单
3、利用LINQ to SQL访问数据库
该方式直接和SQL Server数据库进行交互,执行效率高,速度快,但这种方式不支持其他类型的数据库,在LINQ to SQL中,先利用O/R设计器构建模型,再利用该模型传递SQL语句,执行SQL命令,也可以用LINQ语法直接访问SQL Server
使用这种技术时,一般用它设计自定义的中间层对象模型(中间件),然后将其做成.dll文件供其他应用程序调用
4、利用EF和LINQ to Entities访问数据库(推荐方式)
这是建议的数据库访问方式,利用该模型可支持多种类型的数据库(包括SQL Server、Oracle、DB2、MySQL等),而且可由数据库供应商直接提供该模型的数据库访问引擎
10.1.2 SQL Server 2014简介
SQL Server 2014数据库引擎的主要特点:
(1)提供了针对操作系统升级的AlwaysOn可用性组的跨群集迁移
(2)针对可编程性的增强功能
(3)针对可扩展性和性能的增强功能
(4)提供了对云计算和大数据的支持
10.1.3 创建LocalDB数据库
LocalDB简介:基于服务的数据库,但只能通过本机访问
优点:用法简单,而且将项目和数据库从一台计算机复制到另一台计算机上时,不需要做任何修改
通过应用程序访问LocalDB数据库时,VS2015会自动将该.mdf文件附加到LocalDB的默认实例中,当不再使用数据库时,LocalDB便将.mdf文件从默认实例中自动分离出来
在VS中直接创建数据库的基本用法:
方法一:选择【基于服务的数据库】直接创建数据库(MyDb.mdf)
方法二:
(1)选择【ADO.NET实体数据模型】
(2)选择【来自数据库的Code First】
10.2 利用实体框架创建实体数据模型
10.2.1 实体框架基本概念
实体框架的优点:
(1)应用程序可通过概念模型(包括具有继承性、复杂成员和关系的类型)来工作
(2)应用程序不再对特定的数据引擎或存储架构具有硬编码依赖性
(3)可以在不更改应用程序代码的情况下更改概念模型与特定于存储的架构之间的映射
(4)开发人员可以使用可映射到各种存储架构(可能在不同的数据库管理系统中实现)的一致的应用程序对象模型
(5)多个概念模型可以映射到同一个存储架构
10.2.2 实体框架开发模式
1、数据库优先(Database First)
先创建数据库,然后再根据数据库手工生成对应的实体数据模型(.edmx文件),数据库结构变了,模型必须手工再生成一遍
2、模型优先(Model First)
先利用开发工具提供的模板创建实体数据模型(.edmx文件),然后再根据实体数据模型生成数据库
3、代码优先(Code First,建议的技术)
【实际】先编写数据模型类,然后再据此生成数据库
【参考】先创建数据库,然后生成实体数据模型类,这种办法仅用于生成参考的代码
如果文章对您有帮助,记得一键三连支持一下哦~