Binding基础

Object->MarkupExtension->BindingBase->Binding


Binding相关类


MarkupExtension类

为可以由 .NET XAML 服务及其他 XAML 读取器和 XAML 编写器支持的 XAML 标记扩展实现提供基类。

方法
名称 备注 权限

ProvideValue

当在派生类中实现时,返回用作此标记扩展的目标属性值的对象。 public

BindingBase类

定义 BindingPriorityBinding 和 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
附加属性
名称 备注 对方法应

XmlNamespaceManager

获取或设置用于在 XML 绑定中执行可以识别命名空间的 XPath 查询的 XmlNamespaceManager GetXmlNamespaceManager、SetXmlNamespaceManager
附加事件
名称 备注 对方法应

SourceUpdated

当一个值从绑定目标传输到绑定源时发生,但仅限于其 NotifyOnSourceUpdated 值设置为 true 的绑定。

AddSourceUpdatedHandler

RemoveSourceUpdatedHandler

TargetUpdated

当一个值从绑定源传输到绑定目标时发生,但仅限于其 NotifyOnTargetUpdated 值设置为 true 的绑定。

AddTargetUpdatedHandler

RemoveTargetUpdatedHandler


BindingExpressionBase类

表示 BindingExpressionPriorityBindingExpression 和 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;
方法
名称 备注 权限

UpdateSource

将当前绑定目标值发送到 TwoWay 或 OneWayToSource 绑定中的绑定源属性。 public

UpdateTarget

强制将数据从绑定源属性传输到绑定目标属性。 public

BindingOperations类

提供用于操作绑定的静态方法,包括 BindingMultiBinding 和 PriorityBinding 对象。

属性
名称 备注 权限

DisconnectedSource

当项容器从可视化树中移除时,获取替换 DataContext 的对象。 get;
方法
名称 备注 权限
AccessCollection 提供对集合的访问权限,方法是使用异步机制,该机制在应用程序调用 EnableCollectionSynchronization 时指定。 public
ClearAllBindings 从指定的 DependencyObject 删除所有绑定,包括类型 BindingMultiBinding 和 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
事件
名称 备注

CollectionRegistering

当数据绑定系统注意到集合时发生。

CollectionViewRegistering

当数据绑定系统注意到集合视图时发生。

Binding基础

什么是绑定(Binding)?

数据绑定是在应用 UI 与其显示的数据之间建立连接的过程。 

Binding基础

绑定(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

每当绑定目标属性发生更改时,都会更新绑定源。


Binding基础


绑定的简单范例

后台数据绑定到控件

通过绑定将Bindingsource的实例bs(Source)的Name属性(Path)绑定到TextBox(Target)的Text属性。

TextBox.Text=bs.Name

Binding基础

点击改变绑定数据按钮,绑定数据源的内容改变,但是绑定目标的属性无变化。

Binding基础

<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;
    }

测试

Binding基础

点击改变绑定数据按钮后

Binding基础

实现了后台数据的改变,通知到绑定目标。

注意:

  • 类派生自INotifyPropertyChanged,也就是必须实现该接口
  • 在属性设置器set中触发PropertyChangedEventHandler以通知绑定目标相关属性的改变

 

Binding基础


控件绑定到控件

也就是控件绑定到依赖属性(控件的属性基本都是依赖属性),此时不需要向上面那样处理,因为它是依赖属性。

Binding基础

Binding基础

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);
        }

 

上一篇:wpf-binding


下一篇:手机通过蓝牙和单片机通讯控制乐高车模的LED灯