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 对象计算 Pathget; 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获取或设置一个值,该值指示是否包含 DataErrorValidationRuleget; set;
ValidatesOnExceptions获取或设置一个值,该值指示是否包含 ExceptionValidationRuleget; set;
ValidatesOnNotifyDataErrors获取或设置一个值,该值指示是否包含 NotifyDataErrorValidationRuleget; 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 查询的 XmlNamespaceManagerGetXmlNamespaceManager、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 的此实例无效的 BindingExpressionBaseget;
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);
ReceiveWeakEventbool 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)4要素

  • 绑定源:Source,用作的对象,一般用到后台数据,或者控件的某个属性。
  • 绑定源路径:Path,绑定属性的路径。
  • 绑定目标:Target,一般是某个控件
  • 绑定目标属性:目标属性必须为依赖属性

 

绑定方向(模式)

字段
Default4

使用绑定目标的默认 Mode 值。 每个依赖属性的默认值都不同。 通常,用户可编辑的控件属性(如文本框和复选框的控件属性)默认为双向绑定,而其他大多数属性默认为单向绑定。 确定依赖属性绑定在默认情况下是单向还是双向的编程方法是:使用 GetMetadata(Type) 获取属性的属性元数据,然后检查 BindsTwoWayByDefault 属性的布尔值。

OneTime2

在应用程序启动或数据上下文更改时,更新绑定目标。 如果你在适合使用当前状态的快照或数据实际为静态数据的位置使用数据,则此类型的绑定适合。 如果你想使用源属性中的某个值来初始化目标属性,且提前不知道数据上下文,则此类型的绑定也有用。 这是实质上是 OneWay 绑定的一种简化形式,它在源值不更改的情况下提供更好的性能。

OneWay1

在更改绑定源(源)时更新绑定目标(目标)。 如果绑定的控件为隐式只读,则此类型的绑定适用。 例如,你可能绑定到股票代码等源。 或者可能是未向目标属性提供控件接口来进行更改,例如表的数据绑定背景色。 如果无需监视目标属性的更改,则使用 OneWay 绑定模式可避免 TwoWay 绑定模式的系统开销。

OneWayToSource3

在目标属性更改时,更新源属性。

TwoWay0

导致更改源属性或目标属性时自动更新另一方。 此类型的绑定适用于可编辑窗体或其他完全交互式 UI 方案。

若要检测源更改(适用于 OneWay 和 TwoWay 绑定),则源必须实现合适的属性更改通知机制,例如 INotifyPropertyChanged。请参阅如何:实现属性更改通知

Binding.UpdateSourceTrigger 属性确定触发源更新的因素。

Default0

绑定目标属性的默认 UpdateSourceTrigger 值。 大多数依赖属性的默认值为 PropertyChanged,而 Text 属性的默认值为 LostFocus

Explicit3

仅在调用 UpdateSource() 方法时更新绑定源。

LostFocus2

每当绑定目标元素失去焦点时,都会更新绑定源。

PropertyChanged1

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


显示 UpdateSourceTrigger 属性的角色的图。


绑定的简单范例

后台数据绑定到控件

通过绑定将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);
        }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值