WPF数据绑定Word文档下载推荐.docx
- 文档编号:18431747
- 上传时间:2022-12-16
- 格式:DOCX
- 页数:35
- 大小:276.07KB
WPF数据绑定Word文档下载推荐.docx
《WPF数据绑定Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《WPF数据绑定Word文档下载推荐.docx(35页珍藏版)》请在冰豆网上搜索。
数据绑定可能还意味着如果元素中数据的外部表现形式发生更改,则基础数据可以自动更新以反映更改。
例如,如果用户编辑TextBox元素中的值,则基础数据值会自动更新以反映该更改。
数据绑定的一种典型用法是将服务器或本地配置数据放置到窗体或其他UI控件中。
在WPF中,此概念得到扩展,包括了大量属性与各种数据源的绑定。
在WPF中,元素的依赖项属性可以绑定到CLR对象(包括ADO.NET对象或与Web服务和Web属性相关联的对象)和XML数据。
有关数据绑定的示例,请参见来自
DataBindingDemo(数据绑定演示)的以下应用程序UI:
上面是显示拍卖项列表的应用程序UI。
该应用程序演示数据绑定的以下功能:
∙ListBox的内容绑定到AuctionItem对象的集合。
AuctionItem对象具有一些属性,如Description、StartPrice、StartDate、Category、SpecialFeatures。
∙ListBox中显示的数据(AuctionItem对象)进行模板化,以便显示每个拍卖项的说明和当前价格。
这是使用一个DataTemplate实现的。
此外,每个项的外观取决于要显示的AuctionItem的SpecialFeatures值。
如果AuctionItem的SpecialFeatures值为Color,则该项具有蓝色边框。
如果该值为Highlight,则该项具有橙色边框和一个星号。
数据模板化一节提供了有关数据模板化的信息。
∙用户可以使用提供的CheckBox对数据进行分组、筛选或排序。
在上面的图像中,选中了“Groupbycategory”(按类别分组)和“Sortbycategoryanddate”(按类别和日期排序)CheckBox。
您可能已经注意到数据是根据产品类别分组的,而且类别名称按字母顺序排序。
这些项在每个类别中也是按照起始日期排序的,虽然从该图像中很难注意到这一点。
这是使用集合视图实现的。
绑定到集合一节讨论了集合视图。
∙当用户选中一个项时,ContentControl会显示选定项的详细信息。
这称为主从方案。
主从方案一节提供了有关此类型的绑定方案的信息。
∙StartDate属性的类型为DateTime,该类型返回一个日期,包括精确到毫秒的时间。
在此应用程序中,使用了一个自定义转换器,以便显示较短的日期字符串。
数据转换一节提供了有关转换器的信息。
当用户单击“AddProduct”(添加产品)按钮时,会出现下面的窗体:
用户可以编辑窗体中的字段,使用简略预览和详细预览窗格来预览产品清单,然后单击“submit”(提交)以添加新的产品清单。
任何现有的分组、筛选和排序功能都会应用于新项。
在这种特殊情况下,在上面图像中输入的项会作为Computer类别中的第二项显示。
“StartDate”(起始日期)TextBox中提供的验证逻辑未在此图像中显示。
如果用户输入一个无效日期(无效的格式或过去的日期),则会通过一个ToolTip和TextBox旁的一个红色感叹号来通知用户。
数据验证一节讨论了如何创建验证逻辑。
在详细介绍数据绑定的上述不同功能之前,我们会先在下一节中讨论一些对理解WPF数据绑定非常重要的基本概念。
基本数据绑定概念
本节包含下列子节。
∙数据流的方向
∙触发源更新的原因
不论要绑定什么元素,不论数据源的特性是什么,每个绑定都始终遵循下图所示的模型:
如上图所示,数据绑定实质上是绑定目标与绑定源之间的桥梁。
该图演示以下基本的WPF数据绑定概念:
∙通常,每个绑定都具有四个组件:
绑定目标对象、目标属性、绑定源,以及要使用的绑定源中的值的路径。
例如,如果要将TextBox的内容绑定到Employee对象的Name属性,则目标对象是TextBox,目标属性是Text属性,要使用的值是Name,源对象是Employee对象。
∙目标属性必须为依赖项属性。
大多数UIElement属性都是依赖项属性,而大多数依赖项属性(除了只读属性)默认情况下都支持数据绑定。
(只有DependencyObject类型可以定义依赖项属性,所有UIElement都派生自DependencyObject。
)
∙尽管图中并未指出,但请注意,绑定源对象并不限于自定义CLR对象。
WPF数据绑定支持CLR对象和XML形式的数据。
举例来说,绑定源可以是UIElement、任何列表对象、与ADO.NET数据或Web服务关联的CLR对象,也可以是包含XML数据的XmlNode。
有关更多信息,请参见绑定源概述。
在阅读其他软件开发工具包(SDK)主题时,请务必记住一点:
当您建立绑定时,你是将绑定目标绑定到绑定源。
例如,如果你要使用数据绑定在一个ListBox中显示一些基础XML数据,就是将ListBox绑定到XML数据。
若要建立绑定,请使用Binding对象。
本主题的剩余部分会讨论与Binding对象相关的许多概念以及该对象的一些属性和用法。
数据流的方向
正如上文所述和上图中箭头所示,绑定的数据流可以从数据目标流向数据源(例如,当用户编辑TextBox的值时,源值会发生更改)和/或(如果绑定源提供正确的通知)从绑定源流向绑定目标(例如,TextBox内容会随绑定源中的更改而进行更新)。
您可能希望应用程序使用户可以更改数据并将数据传播回源对象。
或者,您可能不希望允许用户更新源数据。
您可以通过设置Binding对象的Mode属性来对此进行控制。
下图演示不同类型的数据流:
∙OneWay绑定导致对源属性的更改会自动更新目标属性,但是对目标属性的更改不会传播回源属性。
此绑定类型适用于绑定的控件为隐式只读控件的情况。
例如,您可能绑定到如股票行情自动收录器这样的源,或许目标属性没有用于进行更改的控件接口(如表的数据绑定背景色)。
如果无需监视目标属性的更改,则使用OneWay绑定模式可避免TwoWay绑定模式的系统开销。
∙TwoWay绑定导致对源属性的更改会自动更新目标属性,而对目标属性的更改也会自动更新源属性。
此绑定类型适用于可编辑窗体或其他完全交互式UI方案。
大多数属性都默认为OneWay绑定,但是一些依赖项属性(通常为用户可编辑的控件的属性,如TextBox的Text属性和CheckBox的IsChecked属性)默认为TwoWay绑定。
确定依赖项属性绑定在默认情况下是单向还是双向的编程方法是:
使用GetMetadata获取属性的属性元数据,然后检查BindsTwoWayByDefault属性的布尔值。
∙OneWayToSource与OneWay绑定相反;
它在目标属性更改时更新源属性。
一个示例方案是您只需要从UI重新计算源值的情况。
∙OneTime绑定未在图中显示,该绑定会导致源属性初始化目标属性,但不传播后续更改。
这意味着,如果数据上下文发生了更改,或者数据上下文中的对象发生了更改,则更改会反映在目标属性中。
如果您使用的数据的当前状态的快照适于使用,或者这些数据是真正静态的,则适合使用此绑定类型。
如果要使用源属性中的某个值初始化目标属性,并且事先不知道数据上下文,则也可以使用此绑定类型。
此绑定类型实质上是OneWay绑定的简化形式,在源值不更改的情况下可以提供更好的性能。
请注意,若要检测源更改(适用于OneWay和TwoWay绑定),则源必须实现一种合适的属性更改通知机制(如INotifyPropertyChanged)。
Mode属性页提供有关绑定模式的更多信息,以及一个如何指定绑定方向的示例。
触发源更新的原因
TwoWay或OneWayToSource绑定侦听目标属性的更改,并将这些更改传播回源。
这称为更新源。
例如,可以编辑文本框中的文本以更改基础源值。
如上一节中所述,数据流的方向由绑定的Mode属性的值确定。
但是,源值是在您编辑文本的同时进行更新,还是在您结束编辑文本并将鼠标指针从文本框移走后才进行更新呢?
绑定的UpdateSourceTrigger属性确定触发源更新的原因。
下图中右箭头的点演示UpdateSourceTrigger属性的角色:
如果UpdateSourceTrigger值为PropertyChanged,则TwoWay或OneWayToSource绑定的右箭头指向的值会在目标属性更改时立刻进行更新。
但是,如果UpdateSourceTrigger值为LostFocus,则仅当目标属性失去焦点时,该值才会使用新值进行更新。
与Mode属性类似,不同的依赖项属性具有不同的默认UpdateSourceTrigger值。
大多数依赖项属性的默认值都为PropertyChanged,而Text属性的默认值为LostFocus。
这意味着,只要目标属性更改,源更新通常都会发生,这对于CheckBox和其他简单控件很有用。
但对于文本字段,每次键击之后都进行更新会降低性能,用户也没有机会在提交新值之前使用退格键修改键入错误。
这就是为什么Text属性的默认值是LostFocus而不是PropertyChanged的原因。
下表使用TextBox作为示例提供每个UpdateSourceTrigger值的示例方案:
UpdateSourceTrigger值
源值何时进行更新
文本框的示例方案
LostFocus(TextBox.Text的默认值)
当TextBox控件失去焦点时
一个与验证逻辑(请参见“验证逻辑”一节)关联的TextBox
PropertyChanged
当键入到TextBox中时
聊天室窗口中的TextBox控件
Explicit
当应用程序调用UpdateSource时
可编辑窗体中的TextBox控件(仅当用户单击提交按钮时才更新源值)
有关示例,请参见如何:
控制文本框文本更新源的时间。
创建绑定
∙指定绑定源
∙指定值的路径
∙Binding和BindingExpression
前面几节中讨论的一些概念可以概括为:
使用Binding对象建立绑定,每个绑定通常都具有四个组件:
绑定目标、目标属性、绑定源、要使用的源值的路径。
本节讨论如何设置绑定。
请看下面的示例,其中的绑定源对象是一个名为MyData的类,该类在Lesson6Demo命名空间中定义。
出于演示的目的,MyData类具有一个名为ColorName的字符串属性,该属性的值设置为“Red”。
因此,此示例生成一个具有红色背景的按钮。
XAML
<
DockPanelxmlns="
xmlns:
x="
c="
clr-namespace:
SDKSample"
>
DockPanel.Resources>
c:
MyDatax:
Key="
myDataSource"
/>
/DockPanel.Resources>
DockPanel.DataContext>
BindingSource="
{StaticResourcemyDataSource}"
/DockPanel.DataContext>
ButtonBackground="
{BindingPath=ColorName}"
Width="
150"
Height="
30"
IamboundtobeRED!
/Button>
/DockPanel>
DockPanel
xmlns="
有关绑定声明语法的详尽信息以及如何在代码中设置绑定的示例,请参见绑定声明概述。
如果将此示例应用于基本关系图,则生成的图如下所示。
这是一个OneWay绑定,因为Background属性在默认情况下支持OneWay绑定。
您可能会奇怪为什么会这样,即使ColorName属性为类型字符串,而Background属性为Brush类型。
这是由于进行了默认类型转换,此类型转换在数据转换一节中进行了讨论。
指定绑定源
请注意,在上一个示例中,绑定源是通过设置DockPanel元素上的DataContext属性来指定的。
Button随后从DockPanel(这是其父元素)继承DataContext值。
在这里重复一下,绑定源对象是绑定的四个必需组件之一。
因此,如果未指定绑定源对象,则绑定将没有任何作用。
可通过多种方法指定绑定源对象。
在将多个属性绑定到相同源时,可以使用父元素上的DataContext属性。
但是,在各个绑定声明上指定绑定源有时可能更为合适。
对于上一个示例,可以不使用DataContext属性,而是通过在按钮的绑定声明上直接设置Source属性来指定绑定源,如下面的示例中所示:
ButtonWidth="
Background="
{BindingSource={StaticResourcemyDataSource},
Path=ColorName}"
除了在元素上直接设置DataContext属性、从上级继承DataContext值(如第一个示例中的按钮)、通过设置Binding上的Source属性来显式指定绑定源(如最后一个示例中的按钮),还可以使用ElementName属性或RelativeSource属性指定绑定源。
当绑定到应用程序中的其他元素时(例如在使用滑块调整按钮的宽度时),ElementName属性是很有用的。
当在ControlTemplate或Style中指定绑定时,RelativeSource属性是很有用的。
有关更多信息,请参见如何:
指定绑定源。
指定值的路径
如果绑定源是一个对象,则可使用Path属性指定要用于绑定的值。
如果要绑定到XML数据,则可使用XPath属性指定该值。
在某些情况下,可以使用Path属性,即使在数据为XML时。
例如,如果要访问返回的XmlNode(作为XPath查询的结果)的Name属性,则应使用Path属性和XPath属性。
有关语法信息和示例,请参见Path和XPath属性页。
请注意,虽然我们已强调要使用的值的Path是绑定的四个必需组件之一,但在要绑定到整个对象的情况下,要使用的值会与绑定源对象相同。
在这些情况下,不指定Path比较合适。
请看下面的示例:
ListBoxItemsSource="
{Binding}"
IsSynchronizedWithCurrentItem="
true"
上面的示例使用空绑定语法:
{Binding}。
在此情况下,ListBox从父DockPanel元素继承DataContext(此示例中未演示)。
当未指定路径时,默认为绑定到整个对象。
换句话说,在此示例中路径已被省略,因为要将ItemsSource属性绑定到整个对象。
(有关深入讨论,请参见绑定到集合一节。
除了绑定到集合以外,在希望绑定到整个对象,而不是仅绑定到对象的单个属性时,也可以使用此方案。
例如,在源对象为类型字符串,并且您仅仅希望绑定到该字符串本身时。
另一种常见情况是您希望将一个元素绑定到具有多个属性的一个对象。
请注意,您可能需要应用自定义逻辑,使数据对您的绑定目标属性有意义。
自定义逻辑的形式可以是自定义转换器(如果默认类型转换不存在)。
有关转换器的信息,请参见数据转换。
Binding和BindingExpression
在详细介绍数据绑定的其他功能和用法之前,介绍BindingExpression类会十分有用。
如前面几节所述,Binding类是用于绑定声明的高级别类;
Binding类提供了很多属性,您可以利用这些类来指定绑定的特征。
相关类BindingExpression是维持源与目标之间的连接的基础对象。
一个绑定包含可以在多个绑定表达式之间共享的所有信息。
BindingExpression是无法共享的实例表达式,其中包含有关Binding的所有实例信息。
例如,请看下面的示例,其中myDataObject是MyData类的实例,myBinding是源Binding对象,MyData类是包含一个名为MyDataProperty的字符串属性的已定义类。
此示例将mytext(TextBlock的实例)的文本内容绑定到MyDataProperty。
Dimdata1AsNewMyData(DateTime.Now)
Dimbinding1AsNewBinding("
MyDataProperty"
binding1.Source=data1
Me.myText.SetBinding(TextBlock.TextProperty,binding1)
Dimdata1AsNewMyData(DateTime.Now)
Dimbinding1AsNewBinding("
binding1.Source=data1
//makeanewsource
MyDatamyDataObject=newMyData(DateTime.Now);
BindingmyBinding=newBinding("
);
myBinding.Source=myDataObject;
myText.SetBinding(TextBlock.TextProperty,myBinding);
您可以使用相同的myBinding对象来创建其他绑定。
例如,可以使用myBinding对象将复选框的文本内容绑定到MyDataProperty。
在这种情况下,将有两个BindingExpression实例共享myBinding对象。
可以通过对数据绑定对象调用GetBindingExpression的返回值来获取BindingExpression对象。
简单数据绑定
前面所有的案例都是从XAML界面来对数据绑定进行说明,针对前面的数据源我们往往会从其他的地方得到(CLR对象、XML),下面我们来看看简单的数据绑定
XAML:
Grid>
DataGridName="
simpleStu"
AutoGenerateColumns="
False"
DataGrid.Columns>
DataGridTextColumnHeader="
编号"
100"
Binding="
{BindingstuNo}"
姓名"
{BindingstuName}"
年龄"
{Bindingage}"
性别"
{Bindingsex}"
头像"
{BindingstuImage}"
/DataGrid.Columns>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WPF 数据 绑定