现在的位置: 首页 > 综合 > 正文

SilverLight DataBinding绑定详解(学习笔记)——转载

2012年09月19日 ⁄ 综合 ⁄ 共 4911字 ⁄ 字号 评论关闭
在使用Silverlight进行开发的时候,会觉得数据的操作是在是非常简单,不管是用WCF还是Webclient在于服务器通信后,Silverlight处理并显示数据都非常的方便,TextBlock TextBox等控件的使用方法也很容易掌握,但是,Silverlight依旧按照.net的传统提供了数据绑定的功能,使用数据绑定可以让Silverlight的数据操作更加灵活,
  

  在使用Silverlight进行开发的时候,会觉得数据的操作是在是非常简单,不管是用WCF还是Webclient在于服务器通信后,Silverlight处理并显示数据都非常的方便,TextBlock TextBox等控件的使用方法也很容易掌握,但是,Silverlight依旧按照.net的传统提供了数据绑定的功能,使用数据绑定可以让Silverlight的数据操作更加灵活,有序。

  开发过ASP.NET都知道数据的绑定是多么的常用和重要,页面自动更新数据,更具不同的用户操作显示不同的数据可以说是WEB开发的基础,同样Silverlight中的数据绑定也非常重要。

  在微软提供的Silverlight文档中详细的描述了数据绑定的各种方法。不过,由于Silverlight中的绑定与ASP.NET中的数据绑定还有是少许差别,刚接触Silverlight的开发员看过文档后会有不知其所以然的感觉。下面本文就用通俗的方法说明一下。

  首先,Silverlight进行数据绑定的类Binding,这个类提供了相当丰富的方法和属性。

  具体成员列表和说明可在Silverlight文档中找到。

  需要关心的是 Binding类提供了 OneTime OneWay TwoWay三个属性,这三个属性可以指定数据源与目标的互动方式。及一次性绑定,目标随数据源变化而变化,目标和数据源同步变化。

  Binding类不是很复杂,可以说是一个数据源与目标的中间协调员,用到数据绑定将肯定用到它,具体的说明在Silverlight文档中可以找到。

  进行数据绑定可以通过XAML进行 如:(微软示例)

  在 XAML 中创建绑定

  1.定义源对象。

  C#

1
2
3
4
public class Dog
{
    public string DogName { get; set; }
}

  2.在 XAML 中创建对源对象的命名空间的引用。

  XAML

1
2
3
4
UserControl x:Class="BindingXAML.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:my="clr-namespace:BindingXAML">

  3.在 Resources 节创建源对象的实例。

  XAML

1
2
3
<Grid.Resources>
    <my:Dog x:Name="MyDog" DogName="Spot"/>
</Grid.Resources>

  4.通过设置 Source 属性或 DataContext 属性绑定到源对象。该元素的所有子级都继承 DataContext。

  XAML

       <TextBlock Text="{Binding DogName, Source={StaticResource MyDog}, Mode=OneTime}"/>

  - 或 -

  XAML

  <TextBlock Text="{Binding DogName, Mode=OneTime}" DataContext="{StaticResource MyDog}"/>

  此例中数据源是一个XAML对象,该对象是代码中创建的MyDog类的一个实例。Binding是在XAML中的TextBlock中指定的Binding,如示例中的代码那样指定的话,也就相当于创建了以个Binding对象并制定其路径(DogName)和模式等。

  使用代码创建绑定

  1.添加 System.Windows.Data 命名空间。

  C#

  using System.Windows.Data; (Binding类的命名空间)

  2.定义源对象。

  C#

  public class Dog

  {

  public string DogName { get; set; }

  }

  3.创建要绑定到的 FrameworkElement。

  XAML

      <Grid x:Name="LayoutRoot" Background="White">
    <TextBlock x:Name="MyTextBlock" Text="Test"/>
     </Grid>

  4.创建源对象的实例。

  C#

  Dog MyDog = new Dog();

  MyDog.DogName = "Spot";

  5.创建绑定对象。

  C#

  Binding MyBinding = new Binding();

  6.对绑定对象设置绑定属性。

  C#

  MyBinding.Path = new PropertyPath("DogName");

  MyBinding.Mode = BindingMode.OneTime;

  7.通过设置 Source 属性或 DataContext 属性来设置绑定源。该元素的所有子级都继承 DataContext。

  C#

  MyBinding.Source = MyDog;

  - 或 -

  C#

  MyTextBlock.DataContext = MyDog;

  8.将此绑定附加到 FrameworkElement 的属性。

  C#

  MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);

  以上示例中是通过代码创建绑定的示例。这个示例中在TextBlock的Text属性中就没有创建Binding对象了,而是通过后台创建好Binding对象,并设置好属性,然后通过MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);将TEXT属性进行绑定。

  在两个示例中都可以看到,指定数据源有两种方法,以TextBlock为例,可以指定Binding类的Source属性到数据源,也可以将TextBlock的DataContext指定到数据源,效果一样,如果TextBlock没有指定数据源,会在其绑定的Binding中寻找是否有数据源。

  在实际开发中,为了让程序更可看更有条理,我们会混合使用两种方法,及在后台创建数据源,在XAML中绑定。这样前台就免去了创建数据源的XAML元素,后台省去了创建Binding类的代码,并且通过查看前台的XAML代码就可以很容易的判断出各个控件的绑定数据。

  代码:

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

using System.Windows.Data;

 

 

 

namespace SilverlightTest

{

    public partial class Databind : UserControl

    {

        public Databind()

        {

           

            InitializeComponent();

        }

 

        private void UserControl_Loaded(object sender, RoutedEventArgs e)

        {

            Mind m = new Mind();

            txt1.DataContext = m;


        }

 

    }

 

    public class Mind  //数据源

    {

        string _info="OK";

 

        public string Info

        {

            get

            {

                return _info;

            }

            set

            {

                _info = value;

            }

        }

    }

}

XAML:

<UserControl xmlns:data="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="SilverlightTest.Databind"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    Width="400" Height="300" Loaded="UserControl_Loaded">

    <Grid x:Name="LayoutRoot" Background="White">

       

           <TextBlock  x:Name="txt1" Text="{Binding Info,Mode=OneTime}" />

 

    </Grid>

</UserControl>

这样的写法让数据绑定可读性更高,也更容易理解,最常用的方式。

下面来比对下XAML创建和代码创建:

{Binding Info,Mode=OneTime}

相当于

Binding MyBinding = new Binding();

MyBinding.Path = new PropertyPath("Info");
MyBinding.Mode = BindingMode.OneTime;

Text="{Binding Info,Mode=OneTime}"

相当于

MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);

<TextBlock Text="{Binding DogName, Mode=OneTime}" DataContext="{StaticResource MyDog}"/>中的 DataContext="{StaticResource MyDog}

相当于

txt1.DataContext = m;

以上就是在Silverlight中数据绑定的一些简要介绍。

混合XAML 和代码的创建数据绑定的方式是最容易理解和阅读的,所以我们经常会看到在使用DataGrid的通过制定ItemsSource 到数据源后,在XAML中就直接使用"{Binding Address}"进行数据绑定了,DataGrid中的ItemSource也就相当于TextBlock的DataContext属性了,其他控件的数据绑定方法了类似,另外数据源可以用类,也可以是字符串类型等常量类型,使用常量类型时,就不需要指定Binding的Path属性了,因为他本身就是数据。

另外,Binding还有许多高级用法,例如控件对数据的共享,数据的更新绑定等,这些内容在Silverlight文档中都有,清楚基本概念后,万变不离其中。

抱歉!评论已关闭.