Object->MarkupExtension->BindingBase->Binding
Binding相关类
MarkupExtension类
为可以由 .NET XAML 服务及其他 XAML 读取器和 XAML 编写器支持的 XAML 标记扩展实现提供基类。
名称 | 备注 | 权限 |
---|---|---|
当在派生类中实现时,返回用作此标记扩展的目标属性值的对象。 | public |
BindingBase类
定义 Binding、PriorityBinding 和 MultiBinding 类的公共特性。
名称 | 备注 | 权限 |
---|---|---|
BindingGroupName | 获取或设置此绑定所属的 BindingGroup 的名称。 | get; set; |
Delay | 获取或设置更新位于目标更改上的值之后的绑定源前要等待的时间(毫秒)。 | get; set; |
FallbackValue | 获取或设置当绑定无法返回值时要使用的值。 | get; set; |
StringFormat | 获取或设置一个字符串,该字符串指定如果绑定值显示为字符串,应如何设置该绑定的格式。 | get; set; |
TargetNullValue | 获取或设置当源的值为 null 时在目标中使用的值。 |
get; set; |
名称 | 备注 | 权限 |
---|---|---|
ProvideValue | 返回一个应在应用了此绑定和扩展的属性上设置的对象。 | public |
ShouldSerializeFallbackValue | 返回一个值,该值指示序列化进程是否应当对此类的实例的 FallbackValue 有效属性值进行序列化。 | public |
ShouldSerializeTargetNullValue | 返回一个值,该值指示是否应序列化 TargetNullValue 属性。 | public |
Binding类
提供对绑定定义的高级访问,该绑定连接绑定目标对象(通常为 WPF 元素)的属性和任何数据源(例如数据库、XML 文件,或包含数据的任何对象)。
名称 | 备注 | 权限 |
---|---|---|
DoNothing | 用作返回值以指示绑定引擎不执行任何操作。 | public static readonly |
IndexerName | 用作 PropertyName 的 PropertyChangedEventArgs 以指示索引器属性已更改。 | public static readonly |
SourceUpdatedEvent | 标识 SourceUpdated 附加事件。 | public static readonly |
TargetUpdatedEvent | 标识 TargetUpdated 附加事件。 | public static readonly |
XmlNamespaceManagerProperty | 标识 XmlNamespaceManager 附加属性。 | public static readonly |
名称 | 备注 | 权限 |
---|---|---|
AsyncState | 获取或设置传递给异步数据调度程序的不透明数据。 | get; set; |
BindsDirectlyToSource | 获取或设置一个值,该值指示是相对于数据项还是 DataSourceProvider 对象计算 Path。 | get; set; |
Converter | 获取或设置要使用的转换器。 | get; set; |
ConverterCulture | 获取或设置计算转换器要使用的区域性。 | get; set; |
ConverterParameter | 获取或设置要传递给 Converter 的参数。 | get; set; |
ElementName | 获取或设置要用作绑定源对象的元素的名称。 | get; set; |
IsAsync | 获取或设置一个值,该值表示 Binding 是否应异步获取和设置值。 | get; set; |
Mode | 获取或设置一个值,该值指示绑定的数据流方向。 | get; set; |
NotifyOnSourceUpdated | 获取或设置一个值,该值指示当值从绑定目标传输到绑定源时是否引发 SourceUpdated 事件。 | get; set; |
NotifyOnTargetUpdated | 获取或设置一个值,该值指示当值从绑定源传输到绑定目标时是否引发 TargetUpdated 事件。 | get; set; |
NotifyOnValidationError | 获取或设置一个值,该值指示是否对绑定对象引发 Error 附加事件。 | get; set; |
Path | 获取或设置绑定源属性的路径。 | get; set; |
RelativeSource | 通过指定绑定源相对于绑定目标位置的位置,获取或设置此绑定源。 | get; set; |
Source | 获取或设置要用作绑定源的对象。 | get; set; |
UpdateSourceExceptionFilter | 获取或设置一个处理程序,可使用该程序提供自定义逻辑,旨在在更新绑定源值期间处理绑定引擎遇到的异常。 这仅适用于你已将 ExceptionValidationRule 与绑定相关联的情况。 | get; set; |
UpdateSourceTrigger | 获取或设置一个值,它可确定绑定源更新的计时。 | get; set; |
ValidatesOnDataErrors | 获取或设置一个值,该值指示是否包含 DataErrorValidationRule。 | get; set; |
ValidatesOnExceptions | 获取或设置一个值,该值指示是否包含 ExceptionValidationRule。 | get; set; |
ValidatesOnNotifyDataErrors | 获取或设置一个值,该值指示是否包含 NotifyDataErrorValidationRule。 | get; set; |
ValidationRules | 获取用于检查用户输入有效性的规则的集合。 | get; |
XPath | 获取或设置一个 XPath 查询,该查询返回要使用的 XML 绑定源的值。 |
get; set; |
名称 | 备注 | 权限 |
---|---|---|
AddSourceUpdatedHandler | 为 SourceUpdated 附加事件添加处理程序。 | public |
AddTargetUpdatedHandler | 为 TargetUpdated 附加事件添加处理程序。 | public |
GetXmlNamespaceManager | 返回附加到指定对象的绑定所使用的 XML 命名空间管理器对象。 | public |
RemoveSourceUpdatedHandler | 移除 SourceUpdated 附加事件的处理程序。 | public |
RemoveTargetUpdatedHandler | 移除 TargetUpdated 附加事件的处理程序。 | public |
SetXmlNamespaceManager | 设置被附加到提供的元素的绑定所使用的命名空间管理器对象。 | public |
ShouldSerializePath | 指示是否应使 Path 属性持久化。 | public |
ShouldSerializeSource | 指示是否应使 Source 属性持久化。 | public |
ShouldSerializeValidationRules | 指示是否应使 ValidationRules 属性持久化。 | public |
名称 | 备注 | 对方法应 |
---|---|---|
获取或设置用于在 XML 绑定中执行可以识别命名空间的 XPath 查询的 XmlNamespaceManager。 |
GetXmlNamespaceManager、SetXmlNamespaceManager |
名称 | 备注 | 对方法应 |
---|---|---|
当一个值从绑定目标传输到绑定源时发生,但仅限于其 NotifyOnSourceUpdated 值设置为 true 的绑定。 |
AddSourceUpdatedHandler RemoveSourceUpdatedHandler |
|
当一个值从绑定源传输到绑定目标时发生,但仅限于其 NotifyOnTargetUpdated 值设置为 true 的绑定。 |
AddTargetUpdatedHandler RemoveTargetUpdatedHandler |
BindingExpressionBase类
表示 BindingExpression、PriorityBindingExpression 和 MultiBindingExpression 的基类。
名称 | 备注 | 权限 |
---|---|---|
BindingGroup | 获取此 BindingGroup 绑定表达式所属的轴。 | get; |
HasError | 获取一个值,该值指示父绑定是否具有一个失败的验证规则。 | get; |
HasValidationError | 获取一个值,该值指示父绑定是否具有一个失败的验证规则。 | get; |
IsDirty | 获取或设置指示绑定目标是否包含尚未写入到源中的值的值。 | get; |
ParentBindingBase | 获取从中创建此 BindingBase 对象的 BindingExpressionBase 对象。 | get; |
Status | 获取绑定表达式的状态。 | get; |
Target | 获取该绑定表达式的绑定目标对象元素。 | get; |
TargetProperty | 获取此绑定表达式的绑定目标属性。 | get; |
ValidationError | 获取导致 ValidationError 的此实例无效的 BindingExpressionBase。 | get; |
ValidationErrors | 获取导致 ValidationError 实例无效的 BindingExpressionBase 集合。 | get; |
名称 | 备注 | 权限 |
---|---|---|
UpdateSource | 将当前的绑定目标值发送到 TwoWay 或 OneWayToSource 绑定中的绑定源。 | public |
UpdateTarget | 强制将数据从绑定源传输到绑定目标。 | public |
ValidateWithoutUpdate | 对关联的 ValidationRule 运行 Binding 属性设置为 ValidationStep 或 RawProposedValue 的任何 ConvertedProposedValue 对象。 此方法不更新源。 | public |
名称 | 备注 |
---|---|
IWeakEventListener. | bool IWeakEventListener.ReceiveWeakEvent (Type managerType, object sender, EventArgs e); |
ReceiveWeakEvent | bool IWeakEventListener.ReceiveWeakEvent (Type managerType, object sender, EventArgs e); |
BindingExpression类
包含有关 Binding 的单个实例的信息。
名称 | 备注 | 权限 |
---|---|---|
DataItem | 获取此 BindingExpression 使用的绑定源对象。 | get; |
ParentBinding | 返回当前 BindingExpression 的 Binding 对象。 | get; |
ResolvedSource | 获取该 BindingExpression 的绑定源对象。 | get; |
ResolvedSourcePropertyName | 获取BindingExpression 的获取绑定源属性的名称。 | get; |
名称 | 备注 | 权限 |
---|---|---|
将当前绑定目标值发送到 TwoWay 或 OneWayToSource 绑定中的绑定源属性。 | public | |
强制将数据从绑定源属性传输到绑定目标属性。 | public |
BindingOperations类
提供用于操作绑定的静态方法,包括 Binding、MultiBinding 和 PriorityBinding 对象。
名称 | 备注 | 权限 |
---|---|---|
当项容器从可视化树中移除时,获取替换 DataContext 的对象。 | get; |
名称 | 备注 | 权限 |
---|---|---|
AccessCollection | 提供对集合的访问权限,方法是使用异步机制,该机制在应用程序调用 EnableCollectionSynchronization 时指定。 | public |
ClearAllBindings | 从指定的 DependencyObject 删除所有绑定,包括类型 Binding、MultiBinding 和 PriorityBinding 的绑定。 | public |
ClearBinding | 如果存在,则从属性中删除绑定。 | public |
DisableCollectionSynchronization | 移除指定的集合注册的同步。 | public |
EnableCollectionSynchronization | 使 CollectionView 对象能够参与对多个线程上使用的集合的同步访问。 | public |
GetBinding | 检索在指定属性上设置的 Binding 对象。 | public |
GetBindingBase | 检索在指定属性上设置的 BindingBase 对象。 | public |
GetBindingExpression | 返回与指定对象上的指定的绑定目标关联的 BindingExpression 对象。 | public |
GetBindingExpressionBase | 检索在指定属性上设置的 BindingExpressionBase 对象。 | public |
GetMultiBinding | 检索在指定属性上设置的 MultiBinding 对象。 | public |
GetMultiBindingExpression | 返回与指定对象上的指定的绑定目标关联的 MultiBindingExpression 对象。 | public |
GetPriorityBinding | 检索在指定属性上设置的 PriorityBinding 对象。 | public |
GetPriorityBindingExpression | 返回与指定对象上的指定的绑定目标关联的 PriorityBindingExpression 对象。 | public |
GetSourceUpdatingBindingGroups | 获取所有无效值或没有进行源更新的目标值的 BindingGroup 对象。 | public |
GetSourceUpdatingBindings | 获取所有无效值或没有进行源更新的目标值的 BindingExpressionBase 对象。 | public |
IsDataBound | 返回一个值,该值指示指定的属性当前是否是数据绑定的。 | public |
SetBinding | 创建 BindingExpressionBase 的新实例,并将其与指定的绑定目标属性关联。 | public |
名称 | 备注 |
---|---|
当数据绑定系统注意到集合时发生。 | |
当数据绑定系统注意到集合视图时发生。 |
Binding基础
什么是绑定(Binding)?
数据绑定是在应用 UI 与其显示的数据之间建立连接的过程。
绑定(Binding)4要素
- 绑定源:Source,用作源的对象,一般用到后台数据,或者控件的某个属性。
- 绑定源路径:Path,绑定源属性的路径。
- 绑定目标:Target,一般是某个控件
- 绑定目标属性:目标属性必须为依赖属性
绑定方向(模式)
Default | 4 | 使用绑定目标的默认 Mode 值。 每个依赖属性的默认值都不同。 通常,用户可编辑的控件属性(如文本框和复选框的控件属性)默认为双向绑定,而其他大多数属性默认为单向绑定。 确定依赖属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata(Type) 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。 |
OneTime | 2 | 在应用程序启动或数据上下文更改时,更新绑定目标。 如果你在适合使用当前状态的快照或数据实际为静态数据的位置使用数据,则此类型的绑定适合。 如果你想使用源属性中的某个值来初始化目标属性,且提前不知道数据上下文,则此类型的绑定也有用。 这是实质上是 OneWay 绑定的一种简化形式,它在源值不更改的情况下提供更好的性能。 |
OneWay | 1 | 在更改绑定源(源)时更新绑定目标(目标)。 如果绑定的控件为隐式只读,则此类型的绑定适用。 例如,你可能绑定到股票代码等源。 或者可能是未向目标属性提供控件接口来进行更改,例如表的数据绑定背景色。 如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。 |
OneWayToSource | 3 | 在目标属性更改时,更新源属性。 |
TwoWay | 0 | 导致更改源属性或目标属性时自动更新另一方。 此类型的绑定适用于可编辑窗体或其他完全交互式 UI 方案。 |
若要检测源更改(适用于 OneWay 和 TwoWay 绑定),则源必须实现合适的属性更改通知机制,例如 INotifyPropertyChanged。请参阅如何:实现属性更改通知。
Binding.UpdateSourceTrigger 属性确定触发源更新的因素。
Default | 0 | 绑定目标属性的默认 UpdateSourceTrigger 值。 大多数依赖属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus。 |
Explicit | 3 | 仅在调用 UpdateSource() 方法时更新绑定源。 |
LostFocus | 2 | 每当绑定目标元素失去焦点时,都会更新绑定源。 |
PropertyChanged | 1 | 每当绑定目标属性发生更改时,都会更新绑定源。 |
绑定的简单范例
后台数据绑定到控件
通过绑定将Bindingsource的实例bs(Source)的Name属性(Path)绑定到TextBox(Target)的Text属性。
TextBox.Text=bs.Name
点击改变绑定数据按钮,绑定数据源的内容改变,但是绑定目标的属性无变化。
<Window x:Class="BindingDemo.MainWindow"
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:local="clr-namespace:BindingDemo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<TextBox x:Name="tbx1"/>
<Button Content="改变绑定数据" Click="OnClick"/>
<TextBlock x:Name="tbk1"/>
<Slider x:Name="sld1"/>
</StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace BindingDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
Bindingsource bs = new Bindingsource { Name = "myBindingSource" };
public MainWindow()
{
InitializeComponent();
Binding binding = new Binding { Source = bs, Path = new PropertyPath("Name") };
//BindingOperations.SetBinding(tbx1, TextBox.TextProperty, binding);
tbx1.SetBinding(TextBox.TextProperty, binding);
}
private void OnClick(object sender, RoutedEventArgs e)
{
bs.Name = "newBindingSource";
MessageBox.Show("bs.Name :"+ bs.Name.ToString());
}
}
public class Bindingsource
{
private string name;
public string Name
{
set;get;
}
}
实现后台数据更新的同时,目标属性也更新——实现INotifyPropertyChanged接口
INotifyPropertyChanged在System.ComponentModel下
更新Bindingsource类(你的后台数据类型),如下
public class Bindingsource : System.ComponentModel.INotifyPropertyChanged
{
private string name;
public string Name
{
get { return name; }
set
{
name = value;
if (this.PropertyChanged != null)
{
this.PropertyChanged.Invoke(this, new PropertyChangedEventArgs("Name"));
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
测试
点击改变绑定数据按钮后
实现了后台数据的改变,通知到绑定目标。
注意:
- 类派生自INotifyPropertyChanged,也就是必须实现该接口
- 在属性设置器set中触发PropertyChangedEventHandler以通知绑定目标相关属性的改变
控件绑定到控件
也就是控件绑定到依赖属性(控件的属性基本都是依赖属性),此时不需要向上面那样处理,因为它是依赖属性。
XAML代码
<Window x:Class="BindingDemo.MainWindow"
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:local="clr-namespace:BindingDemo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<StackPanel>
<TextBox x:Name="tbx1" Text="{Binding Path=Value, ElementName=sld1}"/>
<Button Content="改变绑定数据" Click="OnClick"/>
<TextBlock x:Name="tbk1"/>
<Slider x:Name="sld1" Maximum="100" Minimum="0" AutoToolTipPlacement="BottomRight" AutoToolTipPrecision="4"/>
</StackPanel>
</Window>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace BindingDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void OnClick(object sender, RoutedEventArgs e)
{
}
}
}
C#代码
<Window x:Class="BindingDemo.MainWindow"
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:local="clr-namespace:BindingDemo"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
</Window>
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace BindingDemo
{
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
//Bindingsource bs = new Bindingsource { Name = "myBindingSource" };
public MainWindow()
{
InitializeComponent();
TextBox tbx1 = new TextBox();
Slider sld1 = new Slider { Maximum=100, Minimum =0,
AutoToolTipPlacement = System.Windows.Controls.Primitives.AutoToolTipPlacement.BottomRight,
AutoToolTipPrecision=4
};
StackPanel stackPanel = new StackPanel();
stackPanel.Children.Add(tbx1);
stackPanel.Children.Add(sld1);
this.Content = stackPanel;
Binding binding = new Binding { Source = sld1, Path = new PropertyPath("Value") };
//BindingOperations.SetBinding(tbx1, TextBox.TextProperty, binding);
tbx1.SetBinding(TextBox.TextProperty, binding);
}