数据绑定模式共有四种:OneTime、OneWay、OneWayToSource和TwoWay,默认是TwoWay。一般来说,完成数据绑定要有三个要点:目标属性是依赖属性、绑定设置和实现了INotifyPropertyChanged接口的数据源(数据上下文)。
OneTime:一次性有效,之后数据源的变化不会对目标属性有任何影响;当然,目标属性的改变也不对数据源有影响。代码如下
<TextBox Height="23" HorizontalAlignment="Left" Margin="174,38,0,0" Name="textBox1" Text="{Binding Path=MyName, Mode=OneTime}" VerticalAlignment="Top" Width="120" />
OneWay:单向作用,数据源的改变会反映到目标属性上;但目标属性的改变不对数据源有影响。代码如下:
<TextBox Height="23" HorizontalAlignment="Left" Margin="176,83,0,0" Name="textBox2" VerticalAlignment="Top" Width="120" Text="{Binding Path=MyName, Mode=OneWay}" />
OneWayToSource:单向作用,跟OneWay的方向相反,目标属性的改变会更新到数据源上;但数据源的更新不会通知目标属性。在这种模式下,目标属性值初始状态一般为空,因为数据源的值对其不起作用。代码如下:
<TextBox Height="23" HorizontalAlignment="Left" Margin="174,38,0,0" Name="textBox3" Text="{Binding Path=MyName, Mode=OneWayToSource}" VerticalAlignment="Top" Width="120" />
TwoWay:双向作用,即目标属性的改变会更新到数据源上,数据源的更新也会通知目标属性。这是绑定的默认方式,可以省略。代码如下:
<TextBox Height="23" HorizontalAlignment="Left" Margin="174,38,0,0" Name="textBox4" Text="{Binding Path=MyName}" VerticalAlignment="Top" Width="120" />
到此这几种模式就介绍完了。不过,我这里还有个有趣的问题:如果数据源没有实现INotifyPropertyChanged接口,这几种模式还能正常工作吗?我做了一些尝试,得出的结论是:
1、OneTime模式根本不受影响;
2、如果在后台代码中更改了数据源,目标属性不会得到通知;
3、如果在界面上更改目标属性,数据源会收到更新通知。
不实现INotifyPropertyChanged接口的数据源到底有没有意义,以及为什麽会出现以上的现象,我还需要深入研究。