数据绑定是将控件、元素与数据相结合的一种技术。控件一般都有双向的服务:显示数据给用户和允许用户改变数据。对于Checkbox,在过去编程时,需要通过编写代码将一个定义的bool变量初始化给checkbox控件。将用户对checkbox的改变返回给该变量。而现在的环境中,我们只需要将checkbox和一个变量绑定即可。绑定会自动完成交互服务。

        在简化编程时,我们经常用databinding代替event handler。尤其是在XAML下,在XAML中定义的databinding可以不需要event handler 所需要的后台事件处理代码。简单而且不易出错。

        数据绑定都有一个源(source)和目的(target)。源一般是一些数据,而目标一般是一个控件。 例如我们用一个label来表示Scrollbar的value(控件到控件的绑定)。我们可以通过事件来完成也可以通过数据绑定来完成。


     绑定语句都放在目标的绑定语句中。如上面的绑定语句就放在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对象的绑定)

 

     在 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 指定来自其中一种类型的数据源。

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 
    Title="Simple Source Binding"
 
    xmlns:local="clr-namespace:XamlExamples"
 
    x:Class="XamlExamples.SimpleSource" >

  
<Window.Resources>
    
<ObjectDataProvider x:Key="MyStringData" 
       ObjectType="{x:Type local:MyStrings}" />
 
  
</Window.Resources>
 
    
<StackPanel>

     
<TextBlock HorizontalAlignment="Center" 
                  FontWeight="Bold">
 
     Simple Source Example 
     
</TextBlock>
 
     
<ListBox Name="theListBox" Width="200" Height="300"

      ItemsSource
="{Binding Source={StaticResource MyStringData}}"/> 
  
</StackPanel>
 
</Window>
 

 

也可以通过要使用的命名空间和类型指定一个 XAML 元素,来创建资源。

如:

 
    
<local:MyStrings x:Key="MyStringData" />
 
  
</Window.Resources>

 该语法的工作方式就像 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 文档中特定节点的值和文本。

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" >
 
 
<StackPanel.Resources>
 
  
<XmlDataProvider x:Key="FavoriteColors">
 
   
<Colors xmlns="">
 
    
<Color ID="1">Blue</Color>
 
    
<Color ID="2">Black</Color>
 
    
<Color ID="3">Green</Color>
 
    
<Color ID="4">Red</Color>
 
   
</Colors>
 
  
</XmlDataProvider>
 
 
</StackPanel.Resources>
 
 
<TextBlock HorizontalAlignment="Center"
 
               FontWeight="Bold">

   XML DataContext Example 
 
</TextBlock> 
 
<Canvas DataContext="{Binding Source={StaticResource FavoriteColors}, 

            XPath='/Colors/Color[@ID=2]'}"
  <TextBlock Text="{Binding XPath=@ID}" /> 
  
<TextBlock Canvas.Top="25" Text="{Binding XPath=.}" />
 
 
</Canvas>
 
</StackPanel> 

通过将DataContext 设置为 XML 文档(以及一个特定的 XPath 表达式),告诉 Canvas:其中所有不包含 Source 的控件

都可以使用容器的 DataContext这样,只需指定 XPath 表达式就能绑定 TextBlock。请注意,每个 TextBlock 中的 XPath 表达式都是相对的 XPath 表达式。

这对于对象绑定也一样。

使用对象代替 XML 仅仅意味着您将使用 Path 表达式代替 XPath 表达式。

  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 
  Title="Simple Source Binding"
 
  x:Class="XamlExamples.SimpleSource" >
 
 
<Window.Resources>
 
  
<ObjectDataProvider TypeName="XamlExamples.MyStrings, XamlExamples" x:Key="MyStringData" />
 
 
</Window.Resources>
 
  
<StackPanel>
 
   
<TextBlock HorizontalAlignment="Center"
 
                 FontWeight="Bold">
 
    Object DataContext Example 
   
</TextBlock>

   
<Canvas DataContext="{Binding Source={StaticResource MyStringData}}"> 
     
<TextBlock Text="{Binding Path=Length}" />
 
     
<TextBlock Canvas.Top="25" Text="{Binding Path=Item[0]}" />
 
   
</Canvas>
 
 
</StackPanel>
 
</Window>
 
 msdn:http://msdn.microsoft.com/zh-cn/library/ms752347.aspx

相关文章:

  • 2021-10-19
  • 2022-12-23
  • 2022-12-23
  • 2021-09-24
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-11-28
  • 2021-07-09
  • 2021-07-28
  • 2021-08-28
  • 2022-12-23
  • 2021-11-05
  • 2021-08-02
相关资源
相似解决方案