wpf数据绑定.docx
《wpf数据绑定.docx》由会员分享,可在线阅读,更多相关《wpf数据绑定.docx(21页珍藏版)》请在冰豆网上搜索。
![wpf数据绑定.docx](https://file1.bdocx.com/fileroot1/2022-10/27/122a9f6f-b831-4b57-a2ba-11dc3abdad89/122a9f6f-b831-4b57-a2ba-11dc3abdad891.gif)
wpf数据绑定
WPF中的数据绑定
目录
数据绑定细节
创建简单的绑定
绑定模式
绑定的时间
绑定到XML
对象绑定和DataTemplates
对数据进行排序
欢迎试用和反馈
到目前为止,很多人都知道使用Windows®PresentationFoundation(WPF)可以轻松地设计强大的用户界面。
但是您可能并不知道它还提供了强大的数据绑定功能。
使用WPF,可以通过利用Microsoft®.NETFramework代码、XAML或两者的组合进行数据操作。
您可以绑定控件、公共属性、XML或对象,从而使数据绑定比以前更快捷、灵活和简单。
所以,让我们来看一下如何开始将控件绑定到您所选的数据源中。
数据绑定细节
要使用WPF数据绑定功能,您必须始终要有目标和源。
绑定的目标可以是从DependencyProperty派生而来的任何可访问属性或元素,例如TextBox控件的Text属性。
绑定的源可以是任何公共属性,包括其他控件、公共语言运行库(CLR)对象、XAML元素、ADO.NETDataset、XML片段等的属性。
为了帮助您正确实现绑定,WPF包含了两个特殊的提供程序:
XmlDataProvider和ObjectDataProvider。
现在让我们看一下WPF数据绑定技术的工作原理,我将列举一些实用的示例来说明它们的用法。
创建简单的绑定
首先,我们来看一个简单的示例,该示例说明了如何将TextBlock的Text属性绑定到ListBox的选定项。
图1中的代码显示的是声明了六个ListBoxItem的ListBox。
该代码示例中的第二个TextBlock具有名为Text(使用XML子元素在XAML属性元素语法中指定)的属性,它将包含TextBlock的文本。
Text属性声明了通过标记与ListBox选定项的绑定。
Binding标记的ElementName属性指示TextBlock的Text属性要与其绑定的控件的名称。
Path属性指示我们将绑定到的元素(在本例中是ListBox)的属性。
此代码产生的结果是,如果从ListBox选择了一种颜色,该颜色的名称则会在TextBlock中显示。
Figure 1 基本但详细的控件绑定
复制代码
"
TextWrapping="Wrap"/>
Name="lbColor"Width="248"Height="56">
"/>
为了使用简单的语法来进行数据绑定,可以对图1中列出的代码稍加修改。
例如,我们用下列代码段替代TextBlock的标记:
复制代码
Text="{BindingElementName=lbColor,
Path=SelectedItem.Content}"/>
这种语法称为属性语法,它压缩了TextBlock的Text属性内部的数据绑定代码。
基本上,Binding标记会连同它的属性一起被归入大括号内。
绑定模式
我可以继续以上述示例为例,将TextBlock的背景色绑定到在ListBox中选择的颜色。
以下代码可将Background属性添加到TextBlock中,并使用该属性的绑定语法将其绑定到ListBox中选定项的值:
复制代码
Text="{BindingElementName=lbColor,Path=SelectedItem.Content,
Mode=OneWay}"
x:
Name="tbSelectedColor"
Background="{BindingElementName=lbColor,Path=SelectedItem.Content,
Mode=OneWay}"/>
如果用户在ListBox中选择了一种颜色,那么该颜色的名称就会出现在TextBlock中,并且TextBlock的背景色会变为选定的颜色(请参见图2)。
图2 将一个源绑定到两个目标
请注意前一个示例中将Mode属性设为OneWay的语句。
Mode属性用于定义绑定模式,它将决定数据如何在源和目标之间流动。
除OneWay之外,还有另外三种绑定模式:
OneTime、OneWayToSource和TwoWay。
正如前面的代码段中所示,使用OneWay绑定时,每当源发生变化,数据就会从源流向目标。
尽管我在示例中显式指定了此绑定模式,但其实OneWay绑定是TextBlock的Text属性的默认绑定模式,无需对其指定。
和OneWay绑定一样,OneTime绑定也会将数据从源发送到目标;但是,仅当启动了应用程序或DataContext发生更改时才会如此操作,因此,它不会侦听源中的更改通知。
与OneWay和OneTime绑定不同,OneWayToSource绑定会将数据从目标发送到源。
最后,TwoWay绑定会将源数据发送到目标,但如果目标属性的值发生变化,则会将它们发回给源。
在上述示例中,我使用了OneWay绑定,因为我希望只要ListBox选择发生变化,就将源(选定的ListBoxItem)发送到TextBlock。
我不希望TextBlock的更改再回到ListBox。
当然,用户无法编辑TextBlock。
如果我想使用TwoWay绑定,可以将TextBox添加到此代码中,将其文本和背景色绑定到ListBox,并将Mode属性设为TwoWay。
用户在ListBox中选择一种颜色后,该颜色就会显示在TextBox中,并且其背景色会相应变化。
如果该用户在TextBox中键入了一种颜色(例如蓝绿色),ListBox中的颜色名称就会更新(从目标到源),反过来,因为ListBox已经更新,所以此新值就会被发送到绑定到ListBox的SelectedItem属性的所有元素。
这意味着TextBlock也会更新其颜色,并且将其文本值设置为该新的颜色(请参见图3)。
图3 运行中的TwoWay绑定
下面是我刚才用来将TextBlock(OneWay)和TextBox(TwoWay)绑定到ListBox的代码:
复制代码
Text="{BindingElementName=lbColor,Path=SelectedItem.Content,
Mode=OneWay}"x:
Name="tbSelectedColor"
Background="{BindingElementName=lbColor,Path=SelectedItem.Content,
Mode=OneWay}"/>
Text="{BindingElementName=lbColor,Path=SelectedItem.Content,
Mode=TwoWay}"x:
Name="txtSelectedColor"
Background="{BindingElementName=lbColor,Path=SelectedItem.Content,
Mode=OneWay}"/>
如果我将TwoWay模式改回到OneWay,用户则可以编辑TextBox中的颜色,且不会导致更改过的值被发回给ListBox。
选择合适的绑定模式非常重要。
当我想向用户显示只读数据时,我通常会采用OneWay模式。
当我希望用户可以更改控件中的数据,并且让该变化能在数据源(DataSet、对象、XML或其他绑定控件)中体现出来时,我会使用TwoWay绑定。
如果想让用户在数据源不将其数据绑定到目标的情况下更改数据源,我发现OneWayToSource是个不错的选择。
我曾经接到一个任务,要求在只读控件中显示与加载屏幕时一样的数据状态。
在这个任务中,我使用了OneTime绑定。
通过使用OneTime绑定,一系列只读控件均被绑定到了数据,并且当用户与表单交互且数据源的值发生更改时,绑定控件仍保持不变。
这为用户提供了一种比较所发生更改的方法。
此外,当源没有实现INotifyPropertyChanged时,OneTime绑定也是一个不错的选择。
绑定的时间
在上述示例中,TextBox允许TwoWay绑定到在ListBox中选定的ListBoxItem。
这会使数据在TextBox失去焦点时从TextBox流回ListBox。
为了改变导致将数据发送回源的这种情况,可以为UpdateSourceTrigger指定值,它是用于定义何时更新源的绑定属性。
可以为UpdateSourceTrigger设置三个值:
Explicit、LostFocus和PropertyChanged。
如果将UpdateSourceTrigger设置为Explicit,则不会更新源,除非从代码调用BindingExpression.UpdateSource方法。
LostFocus设置(TextBox控件的默认值)指示源在目标控件失去焦点时才会更新。
PropertyChanged值指示目标会在目标控件的绑定属性每次发生更改时更新源。
如果您想指示绑定的时间,该设置非常有用。
绑定到XML
绑定到数据源(例如XML)和对象同样也非常方便。
图4显示了XmlDataProvider的示例,其中包含将用作数据源的颜色的嵌入式列表。
XmlDataProvider可用来绑定到XML文档或片断,该文档或片段既可以嵌入在XmlDataProvider标记中,也可以位于外部位置引用的文件中。
Figure 4 XmlDataProvider
复制代码
Key="MoreColors"XPath="/colors">