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 中内置有两种类型的数据提供程序:ObjectDataProviderXMLDataProviderObjectDataProvider 用于绑定到 .NET 对象以及从 .NET 对象绑定,XMLDataProvider 用于绑定到 XML 片段和文档以及从 XML 片段和文档进行绑定。您可以在任何 XAML 容器的资源部分中指定一个数据提供程序。

     使用 XMLDataProvider(与XML对象的绑定)

Code

     在 StackPanel 的资源中,我们有一个 XMLDataProvider 对象。x:Key 表示 Binding 对象中用来引用它的名称。在该提供程序中,我们创建了 XML 内联,用作数据绑定的源。在 ListBoxBinding 中,使用了绑定的 Source属性。如果某个数据源位于 XAML 文档中,您需要指定该对象是一个静态源。最后,我们使用 XPath 语句指定应该使用 XML 文档中的哪个集合来填充 ListBox

     XMLDataProviderSource 属性可以使用路径或 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

     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
posted @ 2008-09-22 17:20  bluealarm  阅读(3197)  评论(0编辑  收藏  举报