在.net中,資料綁定對程式的快速開發提供了一個便利,像一些清單控件,combox,Listbox,datagridview等,都是通過這種簡單的綁定,來實作批量資料的展示。WPF中的資料綁定又提升了一個等級,不但資料庫與UI控件能綁定,UI控件與UI控件的綁定都可以實作,并且綁定到控件上的屬性也得到了大的擴充(以前最常用的綁定屬性是DataSource)。
綁定這個詞就告訴我們,應該是把兩個或更多的事或物結合在一起,是的,在WPF中的綁定,是把綁定目标和綁定源(通常是資料集合,對象,元素控件)結合在一起,這種結合是有選擇的結合,是以在綁定目标和綁定源中,都要先擇出綁定的屬性。舉個例子,我們有一個下拉清單,有一個文本框,我們希望選中的下拉項,顯示到文本框中,這時,下拉清單就是一個綁定源,選中的項就是綁定源屬性,文本框就是綁定目标,Text屬性就是綁定目标屬性。要注意的是,綁定源沒有限制,可以是WPF的元素控件,也可以是一個集合,可以是對象,可以是XML資料等,但綁定目标中的綁定屬性就有限制了,它必需是依賴項屬性。
在綁定中,綁定源和綁定目标有一個橋梁,這個橋量是有方向的,這個方向是通過一個BindingMode枚舉來區分的,這個枚舉代碼如下:
public enum BindingMode
{
// 綁定源和綁定目标雙方觸發更新
TwoWay = 0,
// 綁定源觸發綁定目标更新
OneWay = 1,
//綁定源觸發綁定目标更新一次(隻是在初始化的時侯)
OneTime = 2,
//綁定目标觸發綁定源更新
OneWayToSource = 3,
//預設值,根據控件來确定是單向還是雙向,一般情況下,可編輯控件是雙向綁定,不可編輯控件是單向綁定(即OneWay方式)
Default = 4,
}
}
接下來,先看一個簡單的元素控件和元素控件的綁定。
<Label Content="{Binding ElementName=textBox1,Path=Text}" Height="28" HorizontalAlignment="Left" Margin="146,10,0,0" Name="label1" ;57" />
Content是用綁定來實作的,當然Lable是綁定目标對象,Content就是綁定目标屬性了,綁定源就是ElementName=textBox1,綁定源屬性是Path=Text,由于Lable是不可編輯的,是以Lable.Content的變化隻能依據TextBox.Text了。
上面是通過屬性綁定,代碼綁定如下:
label1.DataContext = textBox1;
label1.SetBinding(Label.ContentProperty, "Text");
接下來,綁定一個對象,對象生成的類如下:
public class Person
int age;
public int Age
{
get
{
return age;
}
set
age = value;
}
string name;
public string Name
return name;
name = value;
接下來,用TextBox來顯示這個對象的Age屬性,可以承載TextBox 的窗裡的構造裡執行個體化一個對象:
person = new Person();
person.Age = 25;
textBox1.DataContext = person;
讓文本框的資料綁定到person這個對象上(也以把person對象綁定到textBox1的父對元素的DataContext上)。
然後把textBox1的Text綁定到對象的Age上,可以用标簽屬性,也可以用代碼,分别如下:
<TextBox Height="23" Text="{Binding Path=Age}" Margin="12,31,0,0" Name="textBox1" ;120" >
textBox1.SetBinding(TextBox.TextProperty, "Age")
上面的綁定都比較簡單,有時間要進行比較特别的綁定,那就是綁定源屬性與綁定目标屬性類型不一樣,這樣的話就需要作一個類型轉換。在窗體上放置一個label2,它的背景色根據Age的變化而變化,小于等20歲為紅色,大于20小于等于50為綠色,大于50為藍色,這如何實作?
首先得構造類型轉換類,在綁定中的轉換,微軟提供了一個接口IValueConverter,我們必需實作這個接口,才能實作綁定的類型轉換。轉換定意如下:
[ValueConversion(typeof(int), typeof(Brush))]
class ConvertClass : IValueConverter
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
if (targetType != typeof(Brush))
return null;
int age = int.Parse(value.ToString());
SolidColorBrush scb = Brushes.White; ;
if (age <= 20)
scb = Brushes.Red;
if (age <= 50 && age > 20)
scb = Brushes.Green;
if (age > 50)
scb = Brushes.Blue ;
return scb;
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
throw new Exception();
這個接口有兩個方法,一個Convert和一個ConvertBack,即兩個類型的轉換“來”和轉換“去”。
在XAML元素中設定,首先設定一個Windows資源(就類似于執行個體化一個ConvertClass對象一樣)
<Window.Resources>
<m:ConvertClass x:Key="Conv"></m:ConvertClass>
</Window.Resources>
然後綁定label2:
<Label Height="28" Background="{Binding Path=Age,Converter={StaticResource Conv}}" Margin="66,60,0,0" Name="label2" ;106" />
代碼實作如下:
Binding bd = new Binding();