绑定声明概述

更新:2010 年 9 月

本主题讨论声明绑定的不同方法。

本主题包括下列各节。

  • 系统必备
  • 在 XAML 中声明绑定
  • 在代码中创建绑定
  • 绑定路径语法
  • 默认行为
  • 相关主题

系统必备

在阅读本主题之前,应当先熟悉标记扩展的概念和使用,这一点非常重要。 有关标记扩展的更多信息,请参见标记扩展和 WPF XAML

本主题不介绍数据绑定的概念。 有关数据绑定概念的讨论,请参见数据绑定概述

在 XAML 中声明绑定

本节讨论如何在 XAML 中声明绑定。

标记扩展使用

Binding 是标记扩展。 当您使用绑定扩展来声明绑定时,声明包含一系列子句,这些子句跟在 Binding 关键字后面,并由逗号 (,) 分隔。 绑定声明中的子句可以按任意顺序排列,因此有许多可能的组合。 子句是名称=值 对,其中名称 是 Binding 属性,值 是您要为该属性设置的值。

当在标记中创建绑定声明字符串时,必须将它们附加到目标对象的特定依赖项属性。 下面的示例演示如何通过使用绑定扩展并指定 SourcePath 属性来绑定 TextBox.Text 属性。

<TextBlock Text="{Binding Source={StaticResource myDataSource}, Path=PersonName}"/>

您可以通过这种方法来指定 Binding 类的大部分属性。 有关绑定扩展的更多信息,以及不能使用绑定扩展设置的 Binding 属性的列表,请参见 绑定标记扩展概述。

对象元素语法

对象元素语法是创建绑定声明的另一种方法。 在大多数情况下,使用标记扩展或对象元素语法没有特定的优势。 但是,在标记扩展不支持您的方案的情况下,例如,当您的属性值是不存在类型转换的非字符串类型时,您将需要使用对象元素语法。

下面是对象元素语法和标记扩展使用的一个示例:

<TextBlock Name="myconvertedtext"
  Foreground="{Binding Path=TheDate,
                       Converter={StaticResource MyConverterReference}}">
  <TextBlock.Text>
    <Binding Path="TheDate"
             Converter="{StaticResource MyConverterReference}"/>
  </TextBlock.Text>
</TextBlock>

此示例通过使用扩展语法声明绑定来绑定 Foreground 属性。 Text 属性的绑定声明使用对象元素语法。

有关不同术语的更多信息,请参见 XAML 语法详述

MultiBinding 和 PriorityBinding

MultiBindingPriorityBinding 不支持 XAML 扩展语法。 因此,如果要在 XAML 中声明 MultiBindingPriorityBinding,则必须使用对象元素语法。

在代码中创建绑定

指定绑定的另一种方法是在代码中直接为 Binding 对象设置属性。 下面的示例演示如何在代码中创建 Binding 对象并指定属性。 在此示例中,TheConverter 是实现 IValueConverter 接口的对象。

    Private Sub OnPageLoaded(ByVal sender As Object, ByVal e As EventArgs)
        ' Make a new source, to grab a new timestamp
        Dim myChangedData As New MyData()

        ' Create a new binding
    ' TheDate is a property of type DateTime on MyData class
        Dim myNewBindDef As New Binding("TheDate")

        myNewBindDef.Mode = BindingMode.OneWay
        myNewBindDef.Source = myChangedData
        myNewBindDef.Converter = TheConverter
        myNewBindDef.ConverterCulture = New CultureInfo("en-US")

    ' myDatetext is a TextBlock object that is the binding target object
        BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef)
        BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef)



...


    End Sub
    private void OnPageLoaded(object sender, EventArgs e)
    {
        // Make a new source, to grab a new timestamp
        MyData myChangedData = new MyData();

        // Create a new binding
    // TheDate is a property of type DateTime on MyData class
        Binding myNewBindDef = new Binding("TheDate");

        myNewBindDef.Mode = BindingMode.OneWay;
        myNewBindDef.Source = myChangedData;
        myNewBindDef.Converter = TheConverter;
        myNewBindDef.ConverterCulture = new CultureInfo("en-US");

    // myDatetext is a TextBlock object that is the binding target object
        BindingOperations.SetBinding(myDateText, TextBlock.TextProperty, myNewBindDef);
        BindingOperations.SetBinding(myDateText, TextBlock.ForegroundProperty, myNewBindDef);



...


}

如果您要绑定的对象是 FrameworkElementFrameworkContentElement,则您可以直接对该对象调用 SetBinding 方法,而不是使用 BindingOperations.SetBinding。 有关示例,请参见如何:在代码中创建绑定

绑定路径语法

使用 Path 属性可以指定您要绑定到的源值:

  • 在最简单的情况下,Path 属性值是要用于绑定的源对象的属性名,如 Path=PropertyName。

  • 在 C# 中可以通过类似语法指定属性的子属性。 例如,子句 Path=ShoppingCart.Order 设置与对象或属性 ShoppingCart 的 Order 子属性的绑定。

  • 若要绑定到附加属性,应在附加属性周围放置圆括号。 例如,若要绑定到附加属性 DockPanel.Dock,则语法是 Path=(DockPanel.Dock)。

  • 可以在要应用索引器的属性名后面的方括号内指定属性的索引器。 例如,子句 Path=ShoppingCart[0] 将绑定设置为与属性的内部索引处理文本字符串“0”的方式对应的索引。 还支持嵌套的索引器。

  • 可以在 Path 子句中混合索引器和子属性;例如,Path=ShoppingCart.ShippingInfo[MailingAddress,Street].

  • 在索引器内部,您可以有多个由逗号 (,) 分隔的索引器参数。 可以使用圆括号指定每个参数的类型。 例如,您可以有 Path="[(sys:Int32)42,(sys:Int32)24]",其中 sys 映射到 System 命名空间。

  • 如果源为集合视图,则可以用斜杠 (/) 指定当前项。 例如,子句 Path=/ 用于设置到视图中当前项的绑定。 如果源为集合,则此语法指定默认集合视图的当前项。

  • 可以结合使用属性名和斜杠来遍历作为集合的属性。 例如,Path=/Offices/ManagerName 指定源集合的当前项,该源集合包含也作为集合的 Offices 属性。 其当前项是一个包含 ManagerName 属性的对象。

  • 也可以使用句点 (.) 路径绑定到当前源。 例如,Text="{Binding}" 等效于 Text="{Binding Path=.}"。

转义机制

  • 在索引器 ([ ]) 内部,插入符号 (^) 用于对下一个字符进行转义。

  • 如果在 XAML 中设置 Path,则还需要使用 XML 实体对 XML 语言定义专用的某些字符进行转义:

    • 使用 &amp; 对字符“&”进行转义。

    • 使用 &gt; 对结束标记“>”进行转义。

  • 此外,如果您使用标记扩展语法描述特性中的整个绑定,则需要使用反斜杠 \ 对 WPF 标记扩展分析程序专用的字符进行转义:

    • 反斜杠 \ 本身是转义字符。

    • 等号 (=) 将属性名与属性值隔开。

    • 逗号 (,) 用于分隔属性。

    • 右大括号 (}) 是标记扩展的结尾。

默认行为

如果未在声明中指定默认行为,则默认行为如下。

  • 创建一个尝试在绑定源值与绑定目标值之间执行类型转换的默认转换器。 如果无法进行转换,则默认转换器会返回 null。

  • 如果您不设置 ConverterCulture,则绑定引擎会使用绑定目标对象的 Language 属性。 在 XAML 中,此属性默认为“en-US”,如果已显式设置了一个值,则从页面的根元素(或任何元素)继承该值。

  • 只要绑定已有数据上下文(例如,来自父元素的继承数据上下文),并且该上下文所返回的项或集合适合于绑定,而不需要进一步的路径修改,则绑定声明可以不必有任何子句:{Binding}。在绑定作用于集合的情况下,这通常是为数据样式指定绑定的方式。 有关更多信息,请参见绑定源概述中的“整个对象用作绑定源”一节。

  • 默认 Mode 可能是单向,也可能是双向,具体取决于所绑定的依赖项属性。 您始终可以显式声明绑定模式,以确保绑定具有所需的行为。 通常,用户可编辑的控件属性(如 TextBox.TextRangeBase.Value)默认为双向绑定,而其他大多数属性默认为单向绑定。

  • 默认 UpdateSourceTrigger 值可能是 PropertyChanged,也可能是 LostFocus,具体也取决于所绑定的依赖项属性。 多数依赖项属性的默认值为 PropertyChanged,而 TextBox.Text 属性的默认值为 LostFocus

请参见

参考

PropertyPath XAML 语法

概念

数据绑定概述

优化性能:数据绑定

其他资源

数据绑定帮助主题

修订记录

日期

修订记录

原因

2010 年 9 月

在“在代码中创建绑定”中说明了 TheConverter。

客户反馈