數據綁定(一)

在.net中,數據綁定對程序的快速開發提供了一個便利,像一些列表控件,combox,Listbox,datagridview等,都是經過這種簡單的綁定,來實現批量數據的展現。WPF中的數據綁定又提高了一個等級,不但數據庫與UI控件能綁定,UI控件與UI控件的綁定均可以實現,而且綁定到控件上的屬性也獲得了大的擴展(之前最經常使用的綁定屬性是DataSource)。數據庫

p_w_picpath

綁定這個詞就告訴咱們,應該是把兩個或更多的事或物結合在一塊兒,是的,在WPF中的綁定,是把綁定目標和綁定源(一般是數據集合,對象,元素控件)結合在一塊兒,這種結合是有選擇的結合,因此在綁定目標和綁定源中,都要先擇出綁定的屬性。舉個例子,咱們有一個下拉列表,有一個文本框,咱們但願選中的下拉項,顯示到文本框中,這時,下拉列表就是一個綁定源,選中的項就是綁定源屬性,文本框就是綁定目標,Text屬性就是綁定目標屬性。要注意的是,綁定源沒有限制,能夠是WPF的元素控件,也能夠是一個集合,能夠是對象,能夠是XML數據等,但綁定目標中的綁定屬性就有限制了,它必需是依賴項屬性。ide

在綁定中,綁定源和綁定目標有一個橋樑,這個橋量是有方向的,這個方向是經過一個BindingMode枚舉來區分的,這個枚舉代碼以下:this

    public enum BindingMode.net

    {雙向綁定

       // 綁定源和綁定目標雙方觸發更新對象

        TwoWay = 0,blog

       // 綁定源觸發綁定目標更新接口

        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

        {

get

            {

return name;

            }

set

            {

                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 &lt;= 50 && age > 20)

            {

                scb = Brushes.Green;

            }

if (age &gt; 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();

  bd.Path = new PropertyPath("Age");

  bd.Converter = new ConvertClass();

  label2.SetBinding(Label.BackgroundProperty, bd);