WPF binding.docx
- 文档编号:23228839
- 上传时间:2023-05-15
- 格式:DOCX
- 页数:12
- 大小:41.75KB
WPF binding.docx
《WPF binding.docx》由会员分享,可在线阅读,更多相关《WPF binding.docx(12页珍藏版)》请在冰豆网上搜索。
WPFbinding
到目前为止,很多人都知道使用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子元素
Text属性声明了通过
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"> XData> XData> 嵌入式XML内容必须置于XmlDataProvider内部的 XData>标记中,如图4所示。 必须为XmlDataProvider提供x: Key值,以便数据绑定目标可对其进行引用。 请注意,XPath属性设置为“/colors”。 此属性定义了将用作数据源的XML内容的级别。 当绑定到可能包含在文件或数据库中的较大XML结构,且想要绑定的数据不是根元素时,这一属性会变得非常有用。 XmlDataProvider是可放置到特定上下文资源内部的一种资源。 如图4所示,已将XmlDataProvider定义为StackPanel上下文中的资源。 这意味着XmlDataProvider将可用于该StackPanel内部的所有内容。 设置资源的上下文有助于限制数据源向合适的区域公开。 这使您可以在页面内分别为控件和支持资源创建定义明确的独立区域,从而提高可读性。 绑定到资源的语法与绑定到元素的语法略有不同。 绑定到控件时,可以设置绑定的ElementName和Path属性。 但是绑定到资源时,需要设置Source属性,由于我们是绑定到XmlDataProvider,所以还要设置绑定的XPath属性。 例如,下列代码可将ListBox的项绑定到MoreColors资源。 将Source属性设置为资源,并将其指定为名为MoreColors的StaticResource。 XPath属性指示项会绑定到XML数据源中 Name="lbColor"Width="248"Height="56" IsSynchronizedWithCurrentItem="True" ItemsSource="{BindingSource={StaticResourceMoreColors}, XPath=color/@name}"> 我在本例中指定了StaticResource,因为XML不会发生更改。 如果数据源发生了更改,则不会将这些更改发送到目标。 DynamicResource设置则表示相反的情况,即会将数据源的更改发送到目标。 当引用系统主题、全球化语言或字体时,该设置非常有用。 DynamicResource将允许这些类型的设置被传送到与其动态绑定的所有UI元素中。 XmlDataProvider也可以指向XML内容的外部源。 例如,我有一个名为colors.xml的文件,其中包含我希望ListBox绑定到的颜色列表。 我只需要将第二个XmlDataProvider资源添加到StackPanel,并将其引向XML文件即可。 请注意,我将Source属性设置为了XML文件的名称,并将x: Key设置为Colors: Key="Colors"Source="Colors.xml"XPath="/colors"/> 两个XmlDataProvider在同一个StackPanel中都作为资源而存在。 我可以使ListBox将其本身绑定到这个新的资源,方法是更改StaticResource设置的名称: Name="lbColor"Width="248"Height="56" IsSynchronizedWithCurrentItem="True" ItemsSource="{BindingSource={StaticResourceColors}, XPath=color/@name}"> 对象绑定和DataTemplates 虽然XmlDataProvider对XML非常有用,但是当您想绑定到对象或对象列表时,可以创建ObjectDataProvider作为资源。 ObjectDataProvider的ObjectType指定将提供数据绑定源的对象,而MethodName则指示为获得数据而需调用的方法。 例如,假设我有一个名为PersonService的类,该类使用一种名为GetPersonList的方法来返回列表 Key="persons" ObjectType="{x: Typesvc: PersonService}" MethodName="GetPersonList"> 如果您想进行更全面的了解,本栏随附的代码中还包含了PersonService和Person类以及其他示例代码。 ObjectDataProvider还可以使用许多其他属性。 ConstructionParameters属性允许您将参数传递给要调用的类的构造函数。 此外,可以使用MethodParameters属性来指定参数,同时还可以使用ObjectInstance属性来指定现有的对象实例作为源。 如果希望异步检索数据,可以将ObjectDataProvider的IsAsynchronous属性设为true。 这样,用户将可以在等待数据填充绑定到ObjectDataProvider的源的目标控件时与屏幕进行交互。 在添加ObjectDataProvider时,必须限定数据源类的命名空间。 在本例中,我必须将xmlns属性添加到 xmlns: svc="clr-namespace: DataBindingWPF" 既然数据源已通过ObjectDataProvider定义,接着我想将ListBox控件中的项绑定到此数据。 我想在每个ListBoxItem中显示两行文本。 第一行将以粗体显示Person实例的FullName属性,第二行将显示该实例的Title和City。 在XAML中,通过使用DataTemplate,这是很容易实现的,DataTemplate允许您定义可重用的数据可视化策略。 图5显示了完整的XAML,其中将DataTemplate定义为在我指定的布局中显示Person信息。 我设置了DataTemplate的DataType属性,以指示DataTemplate将会引用Person类类型。 我没有在DataTemplate中指定真正的绑定,因为我会在ListBox控件中指定。 通过省略绑定源,可对作用域内的当前DataContext执行绑定。 在图5中,我将ListBox的ItemsSource属性设置为绑定到人员资源,以便我可以将数据绑定到ListBox,而不用对它进行格式化。 通过将ItemTemplate属性设置为PersonLayout资源(即DataTemplate的键名),可以正确显示数据。 最终结果的屏幕如图6所示。 Figure 5 对象绑定 Class="DataBindingWPF.ObjectBinding" xmlns=" xmlns: x=" xmlns: svc="clr-namespace: DataBindingWPF" Title="DataBindingWPF"Height="300"Width="300"> Key="persons" ObjectType="{x: Typesvc: PersonService}" MethodName="GetPersonList"> Key="personLayout"DataType="Person"> FontWeight="Bold"Foreground="Blue"> Name="lbPersons" ItemsSource="{BindingSource={StaticResourcepersons}}" ItemTemplate="{DynamicResourcepersonLayout}" IsSynchronizedWithCurrentItem="True"/> 图6 使用DataTemplate 对数据进行排序 如果想以特定的方式对数据进行排序,可以绑定到CollectionViewSource,而不是直接绑定到ObjectDataProvider。 CollectionViewSource则会成为数据源,并充当截取ObjectDataProvider中的数据的媒介,并提供排序、分组和筛选功能,然后将它传送到目标。 接着显示的CollectionViewSource将其Source属性设置为ObjectDataProvider(人员)的资源名称。 然后我通过指示排序依据的属性及其方向定义了数据的排序顺序: Key="personView" Source="{BindingSource={StaticResourcepersons}}"> SortDescription PropertyName="City" Direction="Ascending"/> SortDescription PropertyName="FullName" Direction="Descending"/>
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- WPF binding