在.net中,数据绑定对程序的快速开发提供了一个便利,像一些列表控件,combox,Listbox,datagridview等,都是经过这种简单的绑定,来实现批量数据的展现。WPF中的数据绑定又提高了一个等级,不但数据库与UI控件能绑定,UI控件与UI控件的绑定均可以实现,而且绑定到控件上的属性也获得了大的扩展(之前最经常使用的绑定属性是DataSource)。数据库
绑定这个词就告诉咱们,应该是把两个或更多的事或物结合在一块儿,是的,在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 <= 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();
bd.Path = new PropertyPath("Age");
bd.Converter = new ConvertClass();
label2.SetBinding(Label.BackgroundProperty, bd);