参考官方: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. jdk 生成证书

    1.生成客户端的私钥,客户端的证书 1)keytool -genkey -alias clientkey -keystore kclient.keystore -validity 36500   2) ...

  2. 记录一次惊心动魄的sql去重

    )) )) url 为判重依据,保留最大id其他的数据状态改为删除状态. concat()函数,为字符串拼接函数 从外到内分析sql 第一层四个条件界定,第一个是source渠道,第二个是未删除状态, ...

  3. Python “No module named” 以及在Python2中可以导入,但在python3中却出现的原因

    Python “No module named” 以及在Python2中可以导入,但在python3中却出现的原因 原因之1: 例如有这样的一个包和它的模块: Test __init__.py Mod ...

  4. (转)thymeleaf中的判断总结

    判断String字符串,添加引号 th:class="${flag=='forum.html'}?'active'" 判断boolean类型,注意不能当成字符串处理,不能添加引号 ...

  5. Scala-Unit-1-概述及安装

    一.Scala简介 官网:www.scala-lang.org Scala语言很强大,它集成了面对对象和函数式编程的特点,并且运行在JVM(Java Virtual Machine)上,即必须安装jd ...

  6. 用Eclipse上传项目到github

    1.安装EGit插件 点击菜单栏help->Eclipse Marketplace 2.配置Git 这里是配置相关账户信息 3.把项目提交到本地仓库 右键项目->Team->Shar ...

  7. Mybatis之延迟加载机制

    1.  延迟加载的含义: 用到的时候才会去进行相关操作 2.  延迟加载的例子: 2.1 spring的BeanFactory,在getBean()的时候才创建Bean 2.2 物理分页查询,只有点击 ...

  8. 一种表达式语言的解析引擎JEXL简单使用

    Jexl 是一个 Expression Language 的解析引擎, 是为了方便嵌入你的系统或者程序框架的开发中, 他算是实现了 JSTL 中 EL 的延伸版本. 不过也采用了一些 Velocity ...

  9. SpringMVC(二四) 视图解析流程

    目标方法无论返回的是string.ModelAndView.View,最终都被解析成modelAndView 关键的实现代码是在springmvc.xml配置文件中定义解析器. 参考代码如下: < ...

  10. MySQL Unable to convert MySQL datetime value to System.DateTime 解决方案

    Unable to convert MySQL date/time value to System.DateTime 解决方案 这个问题发生在MySQL数据里面有Date类型数据,在C#中查询出来时候 ...