1.Mode 绑定中数据流的方向(enum BindingMode)
目标属性指的是控件的属性
(1)TwoWay
更改源属性或目标属性时,会自动更新另一方。适用于可编辑窗体 例:TextBox
(2)OneWay
更改源属性时会自动更新目标属性。适用于隐形只读窗体 例:Label
可避免 System.Windows.Data.BindingMode.TwoWay 绑定模式的系统开销
(3)OneTime
在应用程序启动或数据上下文更改时,更新绑定目标
如果你在适合使用当前状态的快照或数据实际为静态数据的位置使用数据,则此类型的绑定适合。 如果你想使用源属性中的某个值来初始化目标属性,且提前不知道数据上下文,则此类型的绑定也有用。
这是实质上是 System.Windows.Data.BindingMode.OneWay 绑定的一种简化形式,它在源值不更改的情况下提供更好的性能。
(4)OneWayToSource
目标属性更改时,会自动更新源属性
(5)Default
使用绑定目标的默认 System.Windows.Data.Binding.Mode 值。 每个依赖属性的默认值都不同。 通常,用户可编辑的控件属性(如文本框和复选框的控件属性)默认为双向绑定,而其他大多数属性默认为单向绑定。确定依赖属性绑定在默认情况下是单向还是双向的编程方法是:使用 System.Windows.DependencyProperty.GetMetadata(System.Type)获取属性的属性元数据,然后检查 System.Windows.FrameworkPropertyMetadata.BindsTwoWayByDefault属性的布尔值。
2.UpdateSourceTrigger 绑定源更新的计时(enum UpdateSourceTrigger)
(1)Default
绑定目标属性的默认 System.Windows.Data.UpdateSourceTrigger 值。 大多数依赖属性的默认值为 System.Windows.Data.UpdateSourceTrigger.PropertyChanged,而System.Windows.Controls.TextBox.Text 属性的默认值为 System.Windows.Data.UpdateSourceTrigger.LostFocus。
(2)PropertyChanged
每当绑定目标属性发生更改时,都会更新绑定源
(3)LostFocus
每当绑定目标元素失去焦点时,都会更新绑定源
(4)Explicit
仅在调用 System.Windows.Data.BindingExpression.UpdateSource 方法时更新绑定源
BindingExpression be = tbName.GetBindingExpression(TextBox.TextProperty);
be.UpdateSource();
3.Converter 获取或设置要使用的转换器
WPF使用转换器(Converter)
WPF多值绑定及多值转换(MultiBinding和IMultiValueConverter)
4.ElementName 要绑定的元素的名称
Content="{Binding ElementName=lblTitle, Path=Content}"
5.Path 获取或设置绑定源属性的路径
Content="{Binding ElementName=lblTitle, Path=Content}"
可以省略Path
Content="{Binding Content, ElementName=lblTitle}"
6.IsAsync 是否应异步获取和设置值
处理大批量的数据时,由于耗时操作,会造成界面的假死,这时需要进行异步操作。一般我们起线程就好了,而绑定属性,只要设置了IsAsync就可以了。
(1)异步设置值
属性:
private int status = 0;
public int Status
{
get { return status; }
set { Thread.Sleep(10000); status = value; RaisePropertyChanged("Status"); }
}
xaml:
<TextBox Text="{Binding Status,IsAsync=True}" HorizontalAlignment="Left" Height="23" Margin="243,208,0,0" VerticalAlignment="Top" Width="120"/>
<Label Content="{Binding Status}" HorizontalAlignment="Left" Height="23" Margin="243,256,0,0" VerticalAlignment="Top" Width="120"/>
效果:
没使用IsAsync=True时,界面会假死10s,然后刷新label内容;使用后,界面不会假死,然后10s后刷新label内容
(2)异步获取值
属性:
private int status = 0;
public int Status
{
get { Thread.Sleep(10000); return status; }
set { status = value; RaisePropertyChanged("Status"); }
}
xaml:
<Label Content="{Binding Status,IsAsync=True}" HorizontalAlignment="Left" Height="23" Margin="243,256,0,0" VerticalAlignment="Top" Width="120"/>
效果:
因为 “控件绑定绑定的属性,值获取后控件才开始显示刷新”,所以设置异步之前Status的get完成后,Label的才显示刷新,会假死10s。