[WPF] - Data Binding

Posted by William Basics on Sunday, November 14, 2021

Introduction

在应用了MVVM设计模式的情况下,Data Binding特别常见。因为我们需要通过它来将前后端分离,让UI的归UI,业务归业务。

所谓Data Binding,就是将数据源中的某些信息赋给目标对象的某个属性。目标对象的这个属性必须是dependency property。因为dependency property原生支持change notification。而数据源的类型就没有什么限制。

四类绑定形式

从数据来源来分类,可以把绑定分成四类形式

  1. 来自于WPF Element
  2. 来自于Source 对象
  3. 来自于Relative Source对象
  4. 来自于DataContext

1. 来自于WPF Element

比如

<Slider Name="FontSizeSlider" Minimum="1" Maximum="40" Value="10" TickFrequency="1" />
<TextBlock FontSize="{Binding ElementName=FontSizeSlider, Path=Value}" />

我们可以直接通过 ElementName来指向引用的界面元素。

2. 来自于Source对象

一般用来绑定静态资源,比如

<Window.Resources>
	<FontFamily x:Key="CustomFont">Calibri</FontFamily>
</Window.Resources>

<TextBlock Text="{Binding Source={StaticResource CustomFont}, Path=Source}"/>

3. 来自于Relative Source对象

这种绑定形式稍微复杂。Relative Source绑定有四个模式

3-1. Self

引用本身的另一个属性。比如

<CheckBox ...... CommandParameter="{Binding RelativeSource={RelativeSource Self},Path=IsChecked}" />

3-2. FindAncestor

引用祖先的一个属性。祖先在这里指在element tree上的祖先。说白了,就是当前节点的父节点或者爷爷节点,以此类推。

在指定寻找祖先的策略时,有两个属性我们需要指定。一个是AncestorType,另一个是AncestorLevel。前者表明了我们要寻找的类型,后者帮助我们跳过不相干的祖先的同类。(AncestorLevel默认为 1,也就是寻找最近的祖先)。

比如,

<TextBlock Text="{Binding Path=Title,
		RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}} }" />

3-3. TemplatedParent

一般用在control template或者data template中,用来引用template的父控件内的属性。

3-4. PreviousData

不常用,skip。

4. 来自于DataContext

这是在MVVM下,最常见的一种绑定,它的好处在于父控件指定了DataContext后,其子控件都能直接绑定DataContext中的属性。

一般我们都将DataContext绑定到我们自定的ViewModel,从而将数据和其表现形式分离。

比如,

<Window ...>
    <Window.DataContext>
        <local:MyViewModel />
    </Window.DataContext>
	<StackPanel>
		<WrapPanel>
			<TextBlock Text="Window title:  " />
			<TextBox Text="{Binding Title, UpdateSourceTrigger=PropertyChanged}" Width="150" />
		</WrapPanel>
		<WrapPanel Margin="0,10,0,0">
			<TextBlock Text="Window dimensions: " />
			<TextBox Text="{Binding Width}" Width="50" />
			<TextBlock Text=" x " />
			<TextBox Text="{Binding Height}" Width="50" />
		</WrapPanel>
	</StackPanel>
</Window>
public class MyViewModel {
    public string Title {get;set;}
    public int Width {get;set;}
    public int Height {get;set;}
}

总结

以上就是WPF中所有的Data Binding的类型。

(end.)