绑定是 wpf 开发中的精髓,有绑定才有所谓的数据驱动。
1 . 背景
目前 wpf 界面可视化的控件,继承关系如下,
控件的数据绑定,基本上都要借助于 FrameworkElement 的 DataContext
属性。
只有先设置了控件的 DataContext 属性,再设置绑定才能生效(TemplateBinding、使用 RelativeSource、后台 new Binding、静态资源等特殊情况另外讨论)。
2. 绑定的参与对象
绑定过程涉及到两个重要的对象
绑定目标
数据源绑定到的 依赖属性
,只有依赖属性才能作为绑定目标。例如 TextBlock.TextProperty
、ItemsControl.ItemsSourceProperty
。
不是只有控件才有依赖属性,普通 CLR 类也可以包括依赖属性。
绑定源
依赖属性绑定的数据源
,例如类中的 属性
、界面中的 资源
等。
3. 使用 DataContext 的数据绑定
定义一个包含 2 个只读属性的类型,
public class SampleViewModel
{
public string Title {
get; }
public int Count {
get; }
public SampleViewModel()
{
Title = "Hello~";
Count = 100;
}
}
界面以 UserControl 为例,在构造函数中设置整个界面的 DataContext。
DataContext 会自动从父类向子类传递,子元素也可重新设置 DataContext 属性为其它值。
设置界面控件的 DataContext,
public partial class BindingView : UserControl
{
public BindingView()
{
InitializeComponent();
DataContext = new SampleViewModel();
}
}
3.1 在前端代码中设置绑定
<UserControl
x:Class="WpfApp1.Views.BindingView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:viewModels="clr-namespace:WpfApp1.ViewModels"
d:DataContext="{d:DesignInstance viewModels:SampleViewModel}"
d:DesignHeight="450"
d:DesignWidth="800"
mc:Ignorable="d">
<Grid Background="DeepPink" Width="100" Height="100">
<StackPanel>
<TextBlock Margin="4" Text="{Binding Title}" />
<TextBlock Margin="4" Text="{Binding Count}" />
</StackPanel>
</Grid>
</UserControl>
显示结果,
3.2 在后端代码中设置绑定
将前端绑定代码去掉,并设置控件的 x:Name 属性值,
<Grid Background="DeepPink" Width="100" Height="100">
<StackPanel>
<TextBlock x:Name="Text1