参考官方:https://docs.microsoft.com/zh-cn/dotnet/framework/wpf/data/data-binding-wpf

实例程序:https://files.cnblogs.com/files/sntetwt/WPFBinding.zip

1、指定绑定源

WPF双向数据同步:目标属性(UI)和源属性(CS)数据同步。

实现双向数据同步数据源需要实现依赖属性INotifyPropertyChanged接口,因为依赖属性有垂直的内嵌变更通知机制。

INotifyPropertyChanged是用于实现界面通知。
DependencyObject是实现依赖对象的依赖属性。

名空间:

using System.ComponentModel;

实现依赖属性INotifyPropertyChanged接口

using System;
using System.ComponentModel; namespace WPFBinding
{
/// <summary>
/// 实现INotifyPropertyChanged接口
/// </summary>
public class Users : INotifyPropertyChanged
{
/// <summary>
/// 姓名
/// </summary>
private string _Name;
public string Name
{
get
{
return _Name;
}
set
{
_Name = value;
OnPropertyChanged("Name");
}
}
/// <summary>
/// Email
/// </summary>
private string _Email;
public string Email
{
get
{
return _Email;
}
set
{
_Email = value;
OnPropertyChanged("Email");
}
}
protected internal virtual void OnPropertyChanged(string propertyName)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public event PropertyChangedEventHandler PropertyChanged;
}
}

2、MVVM架构,ViewModel初始化

namespace WPFBinding
{
public class ViewModel
{
public Users user { get; set; }
public ViewModel()
{
this.user = new Users();
}
}
}

3.1、交互逻辑,实例化数据(方式一)

using System;
using System.Windows; namespace WPFBinding
{
/// <summary>
/// MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public ViewModel viewModel;
public MainWindow()
{
InitializeComponent();
this.viewModel = new ViewModel();
this.Loaded += (s, e) =>
{
this.DataContext = viewModel;
this.viewModel.user = new Users()
{
Name = "杨秀徐",
Email = "471812366@qq.com"
};
};
}
}
}

3.2、XAML绑定数据(方式一)

<TextBox Name="txtName" Text="{Binding user.Name}"></TextBox>
<TextBox Name="txtEmail" Text="{Binding user.Email}"></TextBox>

  

  

4.1、交互逻辑,实例化数据(方式二)

using System.Windows;
using System.Windows.Controls;
using System.Windows.Data; namespace WPFBinding
{
/// <summary>
/// GetBinding.xaml
/// </summary>
public partial class GetBinding : Window
{
public ViewModel viewModel;
public GetBinding()
{
InitializeComponent();
this.viewModel = new ViewModel();
this.Loaded += (s, e) =>
{
this.DataContext = viewModel;
this.viewModel.user = new Users()
{
Name = "杨秀徐",
Email = "471812366@qq.com"
};
//绑定依赖属性Name
txtName.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = viewModel.user });
//绑定元素属性Text
lblName.SetBinding(ContentProperty, new Binding("Text") { Source = txtName });
//绑定依赖属性Email
txtEmail.SetBinding(TextBox.TextProperty, new Binding("Email") { Source = viewModel.user });
//绑定元素属性Text
lblEmail.SetBinding(ContentProperty, new Binding("Text") { Source = txtEmail });
};
}
}
}

4.2、XAML元素(方式二)  

<Label Name="lblName"></Label>
<TextBox Name="txtName"></TextBox>
<Label Name="lblEmail"></Label>
<TextBox Name="txtEmail"></TextBox>

5.1、Binding对象的属性说明

属性名                 描述        
1、Converter:转换器,将绑定的内容转换成自己需要的内容。自定义转换类 必须继承于:IValueConverter接口
2、ElementName:绑定的源对象,本人理解 专程用于UI控件之间属性的绑定
3、FallbackValue :绑定无法返回有效值时的默认显示值
4、Mode:绑定方式,枚举类型 Default OneWay TwoWay OneTime OneWayToSource
5、Path:属性 路径,用来指定要绑定数据源的路径,其性质是一个属性,该属性该当是依靠属性,也即便能够告终积极更新机制的【单个类实现INotifyPropertyChanged、集合要 实现INotifyCollectionChanged接口】
6、RelativeSource:常用于自身绑定或者数据模板中来指定绑定的源对象及控件模块中的绑定。
7、Source:源对象,控件或自定义对象等。
8、StringFormat:格式化表达式
9、UpdateSourceTrigger:在双向绑定时TwoWay 或 OneWayToSource 时。用来确定属性更改的时机。UpdateSourceTrigger枚举类型:Default,PropertyChanged,LostFocus,Explicit。
10、ValidationRules:验证规则.可以被设置为一个或多个派生自ValidationRule的对象,每个规则都会检查特定的条件并更具结果来标记数据的有效性

5.2、Mode指定绑定的方向

数据绑定模式共有四种:OneTime、OneWay、OneWayToSource和TwoWay,默认是TwoWay。

TwoWay 当发生更改时的目标属性或源属性更新目标属性。
OneWay 仅当源属性更改时,请更新目标属性。
OneTime 仅当应用程序启动时或时,请更新目标属性DataContext发生了更改。
OneWayToSource 目标属性更改时,请更新源属性。
Default 默认值将导致Mode要使用的目标属性的值。

5.3、UpdateSourceTrigger    四种用来确定属性更改的时机,对于 Model=TwoWay 及 OneWayToSource是源数据改变时机。

6、UI属性绑定数据对象。

6.1 、UI属性直接绑定实例对象 。实例:Text="{Binding Path=EntryDate, StringFormat=yyyy-MM-dd}"

6.2 、UI属性直接绑定静态对象。实例:DataContext="{x:Static local:GlobalData.user}"

6.3 、UI属性绑定资源中的对象。DataContext="{StaticResource ResourceKey=userKey}"

7、清除绑定

BindingOperations.ClearBinding(txtBlock, TextBlock.TextProperty);

8、集合双向绑定
WPF 提供 ObservableCollection<T> 类,它是实现 INotifyCollectionChanged 接口的数据集合的内置实现。

public class Users : ObservableCollection<Users>
{
public Users() : base()
{ }
}

  

  

WPF双向数据绑定总结的更多相关文章

  1. vue双向数据绑定原理探究(附demo)

    昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...

  2. 双向数据绑定(angular,vue)

    最近github上插件项目更新了关于双向数据绑定的实现方式,关于angular和vue. angular众所周知是使用的脏检查($dirty).一开始大家会认为angular开启了类似setInter ...

  3. jQuery.my – 实时的复杂的双向数据绑定

    jQuery.my 这个插件用于实时双向数据绑定.它发生变异给出的数据源对象,反映了用户与用户界面之间的相互作用.jQuery.my 提供了全面的验证,条件格式,复杂的依赖关系,运行形式结构操作. 马 ...

  4. Angular双向数据绑定MVVM以及基本模式分析

    MVVM: angular的MVVM实现的是双向数据绑定,模型从服务器端抓取到数据,将数据通过控制器(controller)传递到视图(view)显示,视图数据发生变化时同样也会影响到模型数据的变化, ...

  5. 《AngularJS权威教程》中关于指令双向数据绑定的理解

    在<AngularJS权威教程>中,自定义指令和DOM双向数据绑定有一个在线demo,网址:http://jsbin.com/IteNita/1/edit?html,js,output,具 ...

  6. Angular解决双向数据绑定

    <!DOCTYPE html> <html ng-app="myApp1"><body><div ng-controller=" ...

  7. AngularJS入门心得2——何为双向数据绑定

    前言:谁说Test工作比较轻松,最近在熟悉几个case,差点没疯.最近又是断断续续的看我的AngularJS,总觉得自己还是没有入门,可能是自己欠前端的东西太多了,看不了几行代码就有几个常用函数不熟悉 ...

  8. angularJs:双向数据绑定

    示例1 <!DOCTYPE html> <html ng-app> <head> <meta charset="UTF-8" /> ...

  9. angularjs中$http、$location、$watch及双向数据绑定学习实现简单登陆验证

    使用$http.$location.$watch及双向数据绑定等实现简单的用户登陆验证,记录备忘: 1.$http模拟从后台获取json格式的数据: 2.$watch实时监控数据变化: 3.$loca ...

随机推荐

  1. Java程序员如何选择未来的职业路线

    一.程序员的特性 技术出身的职场人特性很明显,与做市场.业务出身的职场人区别尤其明显.IT行业中常见的一些职场角色:老板.项目经理.产品经理.需求分析师.设计师.开发工程师.运维工程师等.开发工程师具 ...

  2. nacos-server集群 安装、运行(ubuntu)

    下载.解压 wget -P /opt/downloads https://github.com/alibaba/nacos/releases/download/1.0.0/nacos-server-1 ...

  3. 数仓1.4 |业务数仓搭建| 拉链表| Presto

    电商业务及数据结构 SKU库存量,剩余多少SPU商品聚集的最小单位,,,这类商品的抽象,提取公共的内容 订单表:周期性状态变化(order_info) id 订单编号 total_amount 订单金 ...

  4. 利用图片的灰度平均值来进行分类实现手写图片识别(数据集50000张图片)——Jason niu

    from collections import defaultdict import mnist_loader def main(): training_data, validation_data, ...

  5. Xamarin Essentials教程数据传输DataTransfer

    Xamarin Essentials教程数据传输DataTransfer   通过数据传输功能,应用程序可以将文本或网址发送到其它的应用程序,这样就可以在应用程序之间共享数据,实现常见的分享功能.Xa ...

  6. 使用C#的is、as操作符来转型

    is检查对象是否兼容于指定类型,返回Boolean值true或false.使用is永远不会抛出异常. 例:Object o=new Object(); bool b1=(o is Object);// ...

  7. Squid快速入门(yum安装)

    加油站代理服务器 前言 Squid是一个Linux系统下优秀的代理服务器软件.Squid可以配置普通上网代理(正向代理).反向代理.透明代理.Squid接收用户的下载申请,并自动处理所下载的数据.当一 ...

  8. BZOJ.5093.[Lydsy1711月赛]图的价值(NTT 斯特林数)

    题目链接 对于单独一个点,我们枚举它的度数(有多少条边)来计算它的贡献:\[\sum_{i=0}^{n-1}i^kC_{n-1}^i2^{\frac{(n-2)(n-1)}{2}}\] 每个点是一样的 ...

  9. django rest_framework 序列化组件详解

    为什么要用序列化组件 当我们做前后端分离的项目,我们前后端交互一般都选择JSON数据格式,JSON是一个轻量级的数据交互格式. 那么我们给前端数据的时候都要转成json格式,那就需要对我们从数据库拿到 ...

  10. sql面试题-----行转列

    tem数据表如下图 select Time as 日期, sum ( case end ) as 胜, sum ( case end ) as 负 from tem group by Time 执行结 ...