Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1016470
  • 博文数量: 243
  • 博客积分: 3053
  • 博客等级: 中校
  • 技术积分: 2975
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-02 21:11
文章分类

全部博文(243)

文章存档

2013年(2)

2012年(20)

2011年(5)

2010年(114)

2009年(102)

我的朋友

分类:

2010-09-17 14:02:26

 在使用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进行 如:(微软示例)
1.定义源对象。
Java代码
  1. public class Dog   
  2. {   
  3.     public string DogName { get; set; }   
  4. }  

2.在 XAML 中创建对源对象的命名空间的引用。
Java代码
  1. "BindingXAML.Page"  
  2. xmlns=""    
  3. xmlns:x=""    
  4. xmlns:my="clr-namespace:BindingXAML">  

3.在 Resources 节创建源对象的实例。
Java代码
  1.   
  2.     "MyDog" DogName="Spot"/>   
  3.   

4.通过设置 Source 属性或 DataContext 属性绑定到源对象。该元素的所有子级都继承 DataContext。
Java代码
  1. "{Binding DogName, Source={StaticResource MyDog}, Mode=OneTime}"/>  

Java代码
  1. "{Binding DogName, Mode=OneTime}" DataContext="{StaticResource MyDog}"/>  

此例中数据源是一个XAML对象,该对象是代码中创建的MyDog类的一个实例。Binding是在XAML中的TextBlock中指定的Binding,如示例中的代码那样指定的话,也就相当于创建了以个Binding对象 并制定其路径(DogName)和模式等
使用代码创建绑定
1.添加 System.Windows.Data 命名空间。
Java代码
  1. using System.Windows.Data; (Binding类的命名空间)  

2.定义源对象。
Java代码
  1. public class Dog   
  2. {   
  3.     public string DogName { get; set; }   
  4. }  

3.创建要绑定到的 FrameworkElement。
Java代码
  1. "LayoutRoot" Background="White">   
  2.     "MyTextBlock" Text="Test"/>   
  3.   

4.创建源对象的实例。
Java代码
  1. Dog MyDog = new Dog();   
  2. MyDog.DogName = "Spot";  

5.创建绑定对象。
Java代码
  1. Binding MyBinding = new Binding();  

6.对绑定对象设置绑定属性。
Java代码
  1. MyBinding.Path = new PropertyPath("DogName");   
  2. MyBinding.Mode = BindingMode.OneTime;  

7.通过设置 Source 属性或 DataContext 属性来设置绑定源。该元素的所有子级都继承 DataContext。
Java代码
  1. MyBinding.Source = MyDog;  

Java代码
  1. MyTextBlock.DataContext = MyDog;  

8.将此绑定附加到 FrameworkElement 的属性。
Java代码
  1. 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代码就可以很容易的判断出各个控件的绑定数据。
Java代码
  1. using System;   
  2. using System.Collections.Generic;   
  3. using System.Linq;   
  4. using System.Net;   
  5. using System.Windows;   
  6. using System.Windows.Controls;   
  7. using System.Windows.Documents;   
  8. using System.Windows.Input;   
  9. using System.Windows.Media;   
  10. using System.Windows.Media.Animation;   
  11. using System.Windows.Shapes;   
  12. using System.Windows.Data;    
  13.   
  14. namespace SilverlightTest   
  15. {   
  16.     public partial class Databind : UserControl   
  17.     {   
  18.         public Databind()   
  19.         {           
  20.             InitializeComponent();   
  21.         }   
  22.   
  23.         private void UserControl_Loaded(object sender, RoutedEventArgs e)   
  24.         {   
  25.             Mind m = new Mind();   
  26.             txt1.DataContext = m;   
  27.         }   
  28.     }   
  29.     
  30.     public class Mind  //数据源   
  31.     {   
  32.         string _info="OK";   
  33.         public string Info   
  34.         {   
  35.             get   
  36.             {   
  37.                 return _info;   
  38.             }   
  39.             set   
  40.             {   
  41.                 _info = value;   
  42.             }   
  43.         }   
  44.     }   
  45. }  

Java代码
  1. "clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Data"  x:Class="SilverlightTest.Databind"  
  2.     xmlns=""  
  3.     xmlns:x=""  
  4.     Width="400" Height="300" Loaded="UserControl_Loaded">   
  5.     "LayoutRoot" Background="White">   
  6.            "txt1" Text="{Binding Info,Mode=OneTime}" />   
  7.        
  8.   

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

下面来比对下XAML创建和代码创建
Java代码
  1. {Binding Info,Mode=OneTime}  

相当于
代码
  1. Binding MyBinding = new Binding();    
  2. MyBinding.Path = new PropertyPath("Info");   
  3. MyBinding.Mode = BindingMode.OneTime;  


Java代码
  1. Text="{Binding Info,Mode=OneTime}"  

相当于
代码
  1. MyTextBlock.SetBinding(TextBlock.TextProperty, MyBinding);  


Java代码
  1. "{Binding DogName, Mode=OneTime}" DataContext="{StaticResource MyDog}"/>中的 DataContext="{StaticResource MyDog}  

相当于
代码
  1. txt1.DataContext = m;  

以上就是在Silverlight中数据绑定的一些简要介绍。
 
如果绑定的对象就是本类的数据成员时,这个数据成员必须是依赖属性,在本类的构造函数中添加
DataContext = this 即可

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

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

上一篇:画刷

下一篇:Encoding for visual studio 2008

给主人留下些什么吧!~~