数据绑定
WPF中的数据绑定
介绍
WPF提供了一个简单和强有力的方式来自动地在业务实体和用户接口更新数据。该机制被称为数据绑定。当你的业务试题的数据发生改变时,它会自动地反映该更新到用户界面,反之亦然。在WPF这是倾向的方法传递数据给用户界面。
数据绑定可以是单向的,也可以是双向的。
数据绑定的源可以是一个普通的.NET属性或者是一个依赖属性。绑定的目标属性必须是一个依赖属性。
为了确保数据绑定正常地工作,绑定的两边必须提供一个当更新目标值触发地改变通知。在普通的.NET属性它通过触发INotifyPropertyChanged接口的PropertyChanged事件来完成。在依赖属性中它通过属性元数据地的PropertyChanged回调来完成。
数据绑定在XAML中使用{Binding}标志扩展实现。下面的例子展示了一个简单的绑定,在TextBox中输入的值通过Text属性反映到Label上。
<StackPanel>
<TextBox Name="txt"/>
<Label Content="{Binding Text, ElementName=txt,UpadteSourceTriger=PropertyChanged}">
</StackPanel>
数据上下文
每个WPF控件从FrameworkElement获得了一个DataContext属性。这个属性意味着设置该数据对象可视化。如果你没有明确定义数据绑定的源,它会设置一个默认的数据上下文。
DataContext属性继承它的值给它的孩子元素。所以你可以设置DataContext在一个高层级布局面板,它的值会被它的所有孩子结点继承。这是非常有用的,如果你想要构建一个具有相同数据对象的多个属性的表单。
<StackPanel DataContext="Customer">
<TextBox Text="{Binding FirstName}">
<TextBox Text="{Binding LastName}">
<TextBox Text="{Binding Street}">
<TextBox Text="{Binding City}">
</StackPanel>
值转换器
如果你想要绑定不同类型的两个属性到一起,你可以使用值转换器。一个值转换器从源类型到目标类型转换它的值,并且可以逆转换。WPF已经包含了许多值转换器,但是大部分情况你会需要写你自己的值转换器(通过实现IValueConverter接口)
一个典型的例子是为了绑定一个布尔类型的成员到可见性属性上。因为可见性是一个枚举(Visible,Collapsed,Hidden),所以你需要一个值转换器。
<StackPanel>
<StackPanel.Resources>
<BooleanToVisibilityConverter x:Key="BoolToVisibility">
</StackPanel.Resources>
<CheckBox x:Name="chkShowDetails" Content="Show Details">
<StackPanel x:Name="detailsPanel" Visibility={Binding IsChecked, Element=chkShowDetails, Converter={StaticResource BoolToVisibility}}>
</StackPanel>
</StackPanel>
下列的列子展示一个简单的从布尔转换到可见性的转换器。注意:它已经是.NET Framework的一部分。
public class BooleanToVisibilityConverter : IValueConverter{
public object Convert(object value, Type targerType, 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)
{
if(value is Visibility)
{
return ((Visibility)value == Visibility.Visible);
}
return value;
}
}
Tip:你可以从MarkupExtension派生你的值转换器,然后覆盖ProvideValue,返回他自己的实例。所以你可以直接地使用它而需要从资源不引用它。
Another Tip:当你获得错误“No constructor for type ... has 0 parameters”,你需要添加一个默认的构造函数到你的转换器,即使你不需要。仅仅为WPF设计者。

浙公网安备 33010602011771号