案例地址:GitHub - microsoft/WPF-Samples: Repository for WPF related samples
一、运行界面
二、案例功能描述
展示不同数据绑定模式
知识点:
1、BindingMode:描述绑定中数据流的方向。
- TwoWay: 导致更改源属性或目标属性时自动更新另一方。 此类型的绑定适用于可编辑窗体或其他完整交互式的 UI 方案。
- OneWay:在更改绑定源(源)时更新绑定目标(目标)。 如果绑定的控件为隐式只读,则此类型的绑定适用。 例如,你可能绑定到股票代码等源。 或者可能是未向目标属性提供控件接口来进行更改,例如表的数据绑定背景色。如果无需监视目标属性的更改,则使用 System.Windows.Data.BindingMode.OneWay 绑定模式可避免 System.Windows.Data.BindingMode.TwoWay绑定模式的系统开销。
- OneTime: 在应用程序启动或数据上下文更改时,更新绑定目标。 如果你在适合使用当前状态的快照或数据实际为静态数据的位置使用数据,则此类型的绑定适合。 如果你想使用源属性中的某个值来初始化目标属性,且提前不知道数据上下文,则此类型的绑定也有用。 这是实质上是 System.Windows.Data.BindingMode.OneWay 绑定的一种简化形式,它在源值不更改的情况下提供更好的性能。
- OneWayToSource:在目标属性更改时,更新源属性。
- Default: 使用绑定目标的默认 System.Windows.Data.Binding.Mode 值。 每个依赖属性的默认值都不同。 通常,用户可编辑的控件属性(如文本框和复选框的控件属性)默认为双向绑定,而其他大多数属性默认为单向绑定。 确定依赖属性绑定在默认情况下是单向还是双向的编程方法是:使用 System.Windows.DependencyProperty.GetMetadata(System.Type)获取属性的属性元数据,然后检查 System.Windows.FrameworkPropertyMetadata.BindsTwoWayByDefault属性的布尔值。
2、Binding.NotifyOnTargetUpdated 获取或设置一个值,该值指示当值从绑定源传输到绑定目标时是否引发 System.Windows.Data.Binding.TargetUpdated 事件。
3、单纯设置绑定模式为TwoWay,但是绑定没有通知属性值改变,就没有效果。想要绑定通知属性值改变可以使用INotifyPropertyChanged接口
三、分析代码
1、添加绑定,设置数据绑定模式
TextBox默认绑定模式是TwoWay,不用特别设置,但是需要设置UpdateSourceTrigger=PropertyChanged,前提是数据源继承INotifyProperytyChanged接口
<!-- OneTime binding example -->
<Label Grid.Row="0" Grid.Column="0">Total Income:</Label>
<TextBlock Name="IncomeText" Grid.Row="0" Grid.Column="1"
Text="{Binding Path=TotalIncome, Mode=OneTime}"/>
<TextBlock Grid.Row="0" Grid.Column="2">OneTime Binding</TextBlock>
<!-- OneWay binding example -->
<Label Grid.Row="1" Grid.Column="0">Rent</Label>
<TextBlock Grid.Row="1" Grid.Column="1" Name="RentText"
Text="{Binding Path=Rent, Mode=OneWay, NotifyOnTargetUpdated=True}"
TargetUpdated="OnTargetUpdated"/>
<TextBlock Grid.Row="1"
Grid.Column="2">OneWay Binding, with TargetUpdated event handling</TextBlock>
<!-- TwoWay binding example (default for TextBox), with UpdateSourceTrigger=PropertyChanged-->
<Label Grid.Row="2" Grid.Column="0">Food</Label>
<TextBox Name="FoodText" Grid.Row="2" Grid.Column="1"
Text="{Binding Path=Food, UpdateSourceTrigger=PropertyChanged}" />
<TextBlock Grid.Row="2" Grid.Column="2">
TwoWay Binding (TextBox default), Update on PropertyChanged</TextBlock>