没有合适的资源?快使用搜索试试~ 我知道了~
中文版WPF Databinding.pdf
3星 · 超过75%的资源 需积分: 10 35 下载量 45 浏览量
2008-09-08
12:55:44
上传
评论 3
收藏 618KB PDF 举报
温馨提示
试读
22页
中文版WPF Databinding.pdf中文版WPF Databinding.pdf中文版WPF Databinding.pdf
资源推荐
资源详情
资源评论
Databinding
1.何为数据绑定
在 WPF 技术中控件基类(FrameworkElement、FrameworkContentElement)中 DataContext 属性实现了绑定机
制,在 XAML 中也支持此机制。当一个控件的 DataContext 发生变化时,其子控件的 DataContext 也会继承父控
件的 DataContext(前提是这个子控件没有另外赋值)。子控件的属性获取数据源中的数据,支持 XAML 通过
Binding 标记获取数据源中的值。数据源更新时刷新其每个子控件中的数据更新,实现一呼百应的效果!
Binding 绑定标记
XAML 处理器支持绑定机制的语法,以{Binding PropertyName=Value}格式出现。其中 PropertyName 基本分
为“数据源指定标记、读取数据源标记、附加选项标记”,Value 可以使用其它标记获取特殊的值。绑定表达式中
可以使用数据源标记、读取数据源标记、附加选项标记组合使用,也可以使用父控件绑定数据源,子控件继承父
控件的数据源并进行绑定。
语法
代码:
<TextBox Name="theTextBox" />
<TextBlock Text="{Binding ElementName=theTextBox, Path=Text}"/>
同于
<TextBox Name="theTextBox" />
<TextBlock>
<TextBlock.Text>
<Binding ElementName="theTextBox" Path="Text" />
</TextBlock.Text>
</TextBlock>
数据源指定标记
Source 属性:通过其它扩展标记制定任何类型的对象实例为数据源,可以使用 StaticResource 等标记设
置。例如:“{Binding Source={StaticResource xKeyElement}, XPath=//item}”,xKeyElement 是 XMLDataProvider 的
对象,意思是获取以 xKeyElement 中所有以 item 为标签节点的数据为数据源。
ElementName 属性:制定当前 XAML 文档中任何以(x:Name)名称为 ElementName 值的对象为数据源。例如:
“{Binding ElementName=ListBox1, Path=SelectedItem}”,意思是把 ListBox1 的 SelectedItem 属性为当前控件的数据
源。
RelativeSource 属性:相对数据源,使用 RelativeSource 可以制定与自身相关联的对象为数据源。例如:
“RelativeSource={RelativeSource Self}}”,读者注意“中间的是 RelativeSource{}是一个扩展标记,而外面的
RelativeSource={}是 Binding 标记的属性”。这段实例代码的意思是获取自身为数据源。
获取数据源标记
Path 属性:于“数据源指定标记”一起使用,获取数据源中的成员(属性)。如果数据源对象继承了
ICustomeTypeDescriptor 接口,将会从接口中获取属性值,否则使用类反射获取。例如:Text="{Binding
ElementName=ListBox1, Path=Items[0].Text}",其中 ElementName 设置数据源,获取 ListBox1.Items[0].Text 并赋
予给 Text 属性。
XPath 属性:于“数据源指定标记”一起使用,通过 XPath 检索 XML 数据源内容。
<ListBox
Width="400" Height="300" Background="Honeydew">
<ListBox.ItemsSource>
<Binding Source="{StaticResource InventoryData}"
XPath="*[@Stock='out'] | *[@Number>=8 or @Number=3]"/>
</ListBox.ItemsSource>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock FontSize="12" Foreground="Red">
<TextBlock.Text>
<Binding XPath="Title"/>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
WPF 教程 - WPF 数据绑定机制详解_.Net 开发论坛 文章来源:IT 人才网(http://www.ad0.cn)
附加选项标记
Model 属性:BindingMode 枚举值,设置数据绑定的依赖机制。
OneWay 仅当源属性发生更改时更新目标属性。
OneTime 仅当应用程序启动时或 DataContext 进行更改时更新目标属性。
OneWayToSource 在目标属性更改时更新源属性。
默认为双向绑定。例如:{Binding Pa IT 人才网(http://it.ad0.cn) th=Value, Mode=OneTime},当数据源更新时
当前控件重新绑定 www.ad0.cn
2.
WPF 中的数据绑定
到目前为止,很多人都知道使用 Windows
®
Presentation Foundation (WPF) 可以轻松地设计强大的用户界面。但是您可能并不知
道它还提供了强大的数据绑定功能。使用 WPF,可以通过利用 Microsoft
®
.NET Framework 代码、XAML 或两者的组合进行数据操作。
您可以绑定控件、公共属性、XML 或对象,从而使数据绑定比以前更快捷、灵活和简单。所以,让我们来看一下如何开始将控件绑定
到您所选的数据源中。
数据绑定细节
要使用 WPF 数据绑定功能,您必须始终要有目标和源。绑定的目标可以是从 DependencyProperty 派生而来的任何可访问属性
或元素,例如 TextBox 控件的 Text 属性。绑定的源可以是任何公共属性,包括其他控件、公共语言运行库 (CLR) 对象、XAML 元素、
ADO.NET Dataset、XML 片段等的属性。为了帮助您正确实现绑定,WPF 包含了两个特殊的提供程序:XmlDataProvider 和
ObjectDataProvider。
现在让我们看一下 WPF 数据绑定技术的工作原理,我将列举一些实用的示例来说明它们的用法。
创建简单的绑定
首先,我们来看一个简单的示例,该示例说明了如何将 TextBlock 的 Text 属性绑定到 ListBox 的选定项。图 1 中的代码显示的是
声明了六个 ListBoxItem 的 ListBox。该代码示例中的第二个 TextBlock 具有名为 Text(使用 XML 子元素 <TextBlock.Text> 在 XAML
属性元素语法中指定)的属性,它将包含 TextBlock 的文本。Text 属性声明了通过 <Binding> 标记与 ListBox 选定项的绑定。Binding
标记的 ElementName 属性指示 TextBlock 的 Text 属性要与其绑定的控件的名称。Path 属性指示我们将绑定到的元素(在本例中是
ListBox)的属性。此代码产生的结果是,如果从 ListBox 选择了一种颜色,该颜色的名称则会在 TextBlock 中显示。
图 1 基本但详细的控件绑定
<StackPanel>
<TextBlock Width="248" Height="24" Text="Colors:"
TextWrapping="Wrap"/>
<ListBox x:Name="lbColor" Width="248" Height="56">
<ListBoxItem Content="Blue"/>
<ListBoxItem Content="Green"/>
<ListBoxItem Content="Yellow"/>
<ListBoxItem Content="Red"/>
<ListBoxItem Content="Purple"/>
<ListBoxItem Content="Orange"/>
</ListBox>
<TextBlock Width="248" Height="24" Text="You selected color:" />
<TextBlock Width="248" Height="24">
<TextBlock.Text>
<Binding ElementName="lbColor" Path="SelectedItem.Content"/>
</TextBlock.Text>
</TextBlock>
</StackPanel>
为了使用简单的语法来进行数据绑定,可以对图 1 中列出的代码稍加修改。例如,我们用下列代码段替代 TextBlock 的 <Binding>
标记:
<TextBlock Width="248" Height="24"
Text="{Binding ElementName=lbColor,
Path=SelectedItem.Content}" />
这种语法称为属性语法,它压缩了 TextBlock 的 Text 属性内部的数据绑定代码。基本上,Binding 标记会连同它的属性一起被归
入大括号内。
绑定模式
我可以继续以上述示例为例,将 TextBlock 的背景色绑定到在 ListBox 中选择的颜色。以下代码可将 Background 属性添加到
TextBlock 中,并使用该属性的绑定语法将其绑定到 ListBox 中选定项的值:
<TextBlock Width="248" Height="24"
Text="{Binding ElementName=lbColor, Path=SelectedItem.Content,
Mode=OneWay}"
x:Name="tbSelectedColor"
Background="{Binding ElementName=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 的代码:
<TextBlock Width="248" Height="24"
Text="{Binding ElementName=lbColor, Path=SelectedItem.Content,
Mode=OneWay}" x:Name="tbSelectedColor"
Background="{Binding ElementName=lbColor, Path=SelectedItem.Content,
Mode=OneWay}"/>
<TextBox Width="248" Height="24"
Text="{Binding ElementName=lbColor, Path=SelectedItem.Content,
Mode=TwoWay}" x:Name="txtSelectedColor"
Background="{Binding ElementName=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 标记中,也可以位于外
部位置引用的文件中。
嵌入式 XML 内容必须置于 XmlDataProvider 内部的 <x:XData> 标记中,如图 4 所示。必须为 XmlDataProvider 提供 x:Key 值,
以便数据绑定目标可对其进行引用。请注意,XPath 属性设置为“/colors”。此属性定义了将用作数据源的 XML 内容的级别。当绑定到
可能包含在文件或数据库中的较大 XML 结构,且想要绑定的数据不是根元素时,这一属性会变得非常有用。
XmlDataProvider 是可放置到特定上下文资源内部的一种资源。如图 4 所示,已将 XmlDataProvider 定义为 StackPanel 上下文
中的资源。这意味着 XmlDataProvider 将可用于该 StackPanel 内部的所有内容。设置资源的上下文有助于限制数据源向合适的区域
公开。这使您可以在页面内分别为控件和支持资源创建定义明确的独立区域,从而提高可读性。
图 4 XmlDataProvider
<StackPanel>
<StackPanel.Resources>
<XmlDataProvider x:Key="MoreColors" XPath="/colors">
<x:XData>
<colors xmlns="">
<color name="pink"/>
<color name="white"/>
剩余21页未读,继续阅读
资源评论
- 老猫莫里斯2013-08-05讲得不够清晰,本以为会把data binding, command binding, view model讲得很实用。
yangliuxiaowu
- 粉丝: 87
- 资源: 35
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 《认识计算机桌面》教案.doc
- 《软件工程》期末考试参考题及答案.doc
- 《软件工程》期末考试及答案.doc
- 《软件工程》经典考试例题复习试题-重点知识点(含答案)(良心出品必属精品).doc
- 《软件工程》经典考试例题复习题-重点知识点(含答案)(良心出品必属精品).docx
- 《软件工程》考试及答案A卷B卷.doc
- python-ldap-3.4.4-cp311-cp311-win-amd64.whl
- 【推荐】logistic分析(可编辑修改).ppt
- 基于opencv的dnn模块实现Yolo-Fastest的目标检测python源码+模型+说明(高分项目).zip
- 使用Python调用微信本地ocr服务.zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功