Silverlight 數據綁定(Binding)

    在使用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#  
    public class Dog
    {
        public string DogName { get; set; }
    }
    
    
      
     
  2. 在 XAML 中創建對源對象的命名空間的引用。

    XAML  
    <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  
    <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代碼就可以很容易的判斷出各個控件的綁定數據。

 

代碼:

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文檔中都有,清楚基本概念後,萬變不離其中。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章