天天看点

数据绑定(一)

在.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 &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();

上一篇: 动画
下一篇: FLex数据绑定