在使用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 中創建綁定
-
定義源對象。
C# public class Dog { public string DogName { get; set; } }
-
在 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">
-
在 Resources 節創建源對象的實例。
XAML <Grid.Resources> <my:Dog x:Name="MyDog" DogName="Spot"/> </Grid.Resources>
-
通過設置 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)和模式等。
使用代碼創建綁定
-
添加 System.Windows.Data 命名空間。
C# using System.Windows.Data; (Binding類的命名空間)
-
定義源對象。
C# public class Dog { public string DogName { get; set; } }
-
創建要綁定到的 FrameworkElement。
XAML <Grid x:Name="LayoutRoot" Background="White"> <TextBlock x:Name="MyTextBlock" Text="Test"/> </Grid>
-
創建源對象的實例。
C# Dog MyDog = new Dog(); MyDog.DogName = "Spot";
-
創建綁定對象。
C# Binding MyBinding = new Binding();
-
對綁定對象設置綁定屬性。
C# MyBinding.Path = new PropertyPath("DogName"); MyBinding.Mode = BindingMode.OneTime;
-
通過設置 Source 屬性或 DataContext 屬性來設置綁定源。該元素的所有子級都繼承 DataContext。
C# MyBinding.Source = MyDog;
- 或 -
C# MyTextBlock.DataContext = MyDog;
-
將此綁定附加到 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文檔中都有,清楚基本概念後,萬變不離其中。