WPF笔记(6)数据绑定(DataBinding)
数据绑定是将控件、元素与数据相结合的一种技术。控件一般都有双向的服务:显示数据给用户和允许用户改变数据。对于Checkbox,在过去编程时,需要通过编写代码将一个定义的bool变量初始化给checkbox控件。将用户对checkbox的改变返回给该变量。而现在的环境中,我们只需要将checkbox和一个变量绑定即可。绑定会自动完成交互服务。
在简化编程时,我们经常用databinding代替event handler。尤其是在XAML下,在XAML中定义的databinding可以不需要event handler 所需要的后台事件处理代码。简单而且不易出错。
数据绑定都有一个源(source)和目的(target)。源一般是一些数据,而目标一般是一个控件。 例如我们用一个label来表示Scrollbar的value(控件到控件的绑定)。我们可以通过事件来完成也可以通过数据绑定来完成。
Code
绑定语句都放在目标的绑定语句中。如上面的绑定语句就放在label的内容中:Content="{Binding ElementName=scroll, Path=Value}"
与StaticResource和DynamicResource一样,Binding也是一个扩展标记。里面有绑定的元素(Elementname)和路径(path)。
绑定的目标对象必须是从DependencyObject继承。绑定的属性必须返回为一个Dependency属性。上面的XAML代码可以用C#来实现。
Binding bind = new Binding();
bind.Source = scroll;
bind.Path = new PropertyPath(ScrollBar.ValueProperty);
lbl.SetBinding(Label.Content, bind);
绑定源(Source)
在前面的示例中,我们使用的是 ElementName 属性(它用于绑定到一个控件),而不是使用 Source 属性。然而,在大多数基于 XAML 的项目中,我们将使用Source属性绑定到除控件外的源,如 XML 或 .NET 对象。XAML 用其 provider 对象支持该操作。XAML 中内置有两种类型的数据提供程序:ObjectDataProvider 和 XMLDataProvider。ObjectDataProvider 用于绑定到 .NET 对象以及从 .NET 对象绑定,XMLDataProvider 用于绑定到 XML 片段和文档以及从 XML 片段和文档进行绑定。您可以在任何 XAML 容器的资源部分中指定一个数据提供程序。
使用 XMLDataProvider(与XML对象的绑定)
Code
在 StackPanel 的资源中,我们有一个 XMLDataProvider 对象。x:Key 表示 Binding 对象中用来引用它的名称。在该提供程序中,我们创建了 XML 内联,用作数据绑定的源。在 ListBox 的 Binding 中,使用了绑定的 Source属性。如果某个数据源位于 XAML 文档中,您需要指定该对象是一个静态源。最后,我们使用 XPath 语句指定应该使用 XML 文档中的哪个集合来填充 ListBox。
XMLDataProvider 的 Source 属性可以使用路径或 URL 来查找 XML 的源,也可以使用标准的URL。如:<XmlDataProvider x:Key="FavoriteColors" Source="D:\colors.xml" />
<XmlDataProvider x:Key="MyRSS" Source="http://www.google.com/RSS" />
使用 ObjectDataProvider(与.NET对象的绑定)
到.NET 对象的绑定需要使用 ObjectDataProvider。该数据提供程序使您能够为 .NET 数据类型创建绑定。
例如,我们可以在 .NET 中创建一个简单的字符串集合,如下所示。
public class MyStrings : List { public MyStrings() { this.Add("Hello"); this.Add("Goodbye"); } }导入了命名空间和类之后,就使用 ObjectDataProvider 指定来自其中一种类型的数据源。
Code
也可以通过要使用的命名空间和类型指定一个 XAML 元素,来创建资源。
如:
Code该语法的工作方式就像 ObjectDataSource 一样,只不过更易于使用。既然已经导入了命名空间,
我们就可以添加一个引用我们的数据源类的资源了,方法是指定该类的名称(例如, MyStrings)。
数据绑定与前面的示例相同,因为 XAML 代码并不关心它是何种数据源,只要是数据源就可以了。
绑定模式
在大多数情况下,您希望绑定是一个双向绑定。Binding 对象支持几种模式以支持不同的用例,如表 所示。
绑定模式 | |
绑定模式 | 说明 |
TwoWay | 双向移动绑定控件或绑定源的改动。(这是默认模式。) |
OneWay | 仅将改动从源移动到控件。当源发生改动时,绑定控件的数据也相应更改。 |
OneTime | 数据仅在启动时绑定,第一次用数据填充控件后忽略对源的更改。 |
在标记中包括模式即可指定模式,如下所示。
{Binding ElementName=theTextBox, Path=Text, Mode=OneTime}
控制绑定时间
除了模式,您还可以使用UpdateSourceTrigger 指定绑定何时推出更改。您可以指定绑定仅在指定的时间进行更改,方法是指定 UpdateSourceTrigger 类型。
{Binding ElementName=theTextBox, Path=Text, UpdateSourceTrigger=LostFocus}。
UpdateSourceTrigger 属性指定何时用改动更新源。这仅对 Mode=TwoWay 绑定(默认方式)有效。下表显示 UpdateSourceTrigger 的有效值。
表 UpdateSourceTrigger 值 | |
UpdateSourceTrigger | 说明 |
Explicit | 源仅通过显式调用 BindingExpression.UpdateSource 方法更新。 |
LostFocus | 绑定控件失去焦点时更新源。 |
PropertyChanged | 每次属性更改时都将改动更新到源。这是默认行为。 |
DataContext 专门用于指定某个容器中的所有控件都将绑定到一个公共对象。
以下是一个示例:我们有一个 Canvas,它将显示 XML 文档中特定节点的值和文本。
Code
通过将DataContext 设置为 XML 文档(以及一个特定的 XPath 表达式),告诉 Canvas:其中所有不包含 Source 的控件
都可以使用容器的 DataContext。这样,只需指定 XPath 表达式就能绑定 TextBlock。请注意,每个 TextBlock 中的 XPath 表达式都是相对的 XPath 表达式。
这对于对象绑定也一样。
使用对象代替 XML 仅仅意味着您将使用 Path 表达式代替 XPath 表达式。
Code
msdn:http://msdn.microsoft.com/zh-cn/library/ms752347.aspx