简介
WPf提供了一个简单而又强大的方式来自动更新业务层和用户界面之间的数据,这钟机制叫做数据绑定。每次当业务层的数据改变时,它都会自动更新用户界面,反过来也一样。这就是WPF在传递给用户界面时候首选的方法。
数据绑定可以是单向的(资源-->目标或者目标-->资源)也可以是双向的(资源<-->目标)。
要绑定的资源属性可以是一个普通等CLR属性,也可以是依赖属性。但是绑定的目标属性必须是一个依赖属性。
为了让绑定更好的工作,绑定的双方都必须提供一个改变通知以便在一方改变的情况下更新另一方。普通的CLR属性可以通过实现INotifyPropertyChanged接口的PropertyChanged方法来处理。依赖属性则是通过元数据属性的PropertyChanged的回调来处理的。
数据绑定在XAML中通常使用{Binding}扩展标签来完成。下面例子简单的展示了一个文本框和标签的数据绑定,标签里的直会根据文本框的输入而改变的哦。
<StackPanel>
<TextBox x:Name="txtInput" />
<Label Content="{Binding Text, ElementName=txtInput,
UpdateSourceTrigger=PropertyChanged}" />
</StackPanel>
数据上下文(DataContext)
每一个由FrameworkElement衍生出来的WPF控件都有DataContext属性。这个属性可以给其设置一个可见的数据对象。一旦不能准确地为其绑定一个资源,可以给其默认一个DataContext。
DataContext可以为它的子控件传承它的值。所以可以在上层的布局容器中设置一个DataContext,那么它的所有子控件就都继承了它的值。这点在你想绑定一个i数据对象的多个属性时是非常有用的。
<StackPanel DataContext="{StaticResource myCustomer}">
<TextBox Text="{Binding FirstName}"/>
<TextBox Text="{Binding LastName}"/>
<TextBox Text="{Binding Street}"/>
<TextBox Text="{Binding City}"/>
</StackPanel>
数值转换
如果你想把两个不同类型的属性绑定在一起时,就不得不使用数值转换了。一个数值转换器可以将值从源类型转换到目标类型并能成功返回。WPF虽然已经有一些数值转换取,但是大多数情况下你还是需要执行IValueConverter接口来写出自己的转换器。
一个经典的例子就是给控件的Visibililty属性绑定一个Bool值。但visibility属性是一个包含Visble,Collapsed和Hidden的枚举类型,所以你需要一个如下的转换器:
<StackPanel>
<StackPanel.Resources>
<BooleanToVisibilityConverter x:Key="boolToVis" />
</StackPanel.Resources>
<CheckBox x:Name="chkShowDetails" Content="Show Details" />
<StackPanel x:Name="detailsPanel"
Visibility="{Binding IsChecked, ElementName=chkShowDetails,
Converter={StaticResource boolToVis}}">
</StackPanel>
</StackPanel>
下面的例子展示了一个将Bool类型转换为visibilty的简单转换器。提示:这个转换器已经包含在.NetFramework里了。
public class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter,
CultureInfo culture)
{
if (value is Boolean)
{
return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
throw new NotImplementedException();
}
}