WPF双向数据绑定总结
参考官方: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>
/// </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双向数据绑定总结的更多相关文章
- vue双向数据绑定原理探究(附demo)
昨天被导师叫去研究了一下vue的双向数据绑定原理...本来以为原理的东西都非常高深,没想到vue的双向绑定真的很好理解啊...自己动手写了一个. 传送门 双向绑定的思想 双向数据绑定的思想就是数据层与 ...
- 双向数据绑定(angular,vue)
最近github上插件项目更新了关于双向数据绑定的实现方式,关于angular和vue. angular众所周知是使用的脏检查($dirty).一开始大家会认为angular开启了类似setInter ...
- jQuery.my – 实时的复杂的双向数据绑定
jQuery.my 这个插件用于实时双向数据绑定.它发生变异给出的数据源对象,反映了用户与用户界面之间的相互作用.jQuery.my 提供了全面的验证,条件格式,复杂的依赖关系,运行形式结构操作. 马 ...
- Angular双向数据绑定MVVM以及基本模式分析
MVVM: angular的MVVM实现的是双向数据绑定,模型从服务器端抓取到数据,将数据通过控制器(controller)传递到视图(view)显示,视图数据发生变化时同样也会影响到模型数据的变化, ...
- 《AngularJS权威教程》中关于指令双向数据绑定的理解
在<AngularJS权威教程>中,自定义指令和DOM双向数据绑定有一个在线demo,网址:http://jsbin.com/IteNita/1/edit?html,js,output,具 ...
- Angular解决双向数据绑定
<!DOCTYPE html> <html ng-app="myApp1"><body><div ng-controller=" ...
- AngularJS入门心得2——何为双向数据绑定
前言:谁说Test工作比较轻松,最近在熟悉几个case,差点没疯.最近又是断断续续的看我的AngularJS,总觉得自己还是没有入门,可能是自己欠前端的东西太多了,看不了几行代码就有几个常用函数不熟悉 ...
- angularJs:双向数据绑定
示例1 <!DOCTYPE html> <html ng-app> <head> <meta charset="UTF-8" /> ...
- angularjs中$http、$location、$watch及双向数据绑定学习实现简单登陆验证
使用$http.$location.$watch及双向数据绑定等实现简单的用户登陆验证,记录备忘: 1.$http模拟从后台获取json格式的数据: 2.$watch实时监控数据变化: 3.$loca ...
随机推荐
- [转,讲的非常精彩]CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍)
http://blog.csdn.net/dan15188387481/article/details/49873923 CIDR地址块及其子网划分(内含原始IP地址分类及其子网划分的介绍) 1. ...
- day46 html
老师的笔记: day46 课程安排 HTML CSS JS基础 DOM操作 jQuery Bootstrap pymysql Django基础 项目实战 Vue.js 今日概要: "PUT ...
- easyui+themeleaf 分页查询实现
<!DOCTYPE html> <html xmlns:th="http://www.w3.org/1999/xhtml"> <head> &l ...
- ASP.NET MVC 常用路由总结
1.URL模式 路由系统用一组路由来实现它的功能,这些路由共同组成了应用系统URL架构或方案,这种URL架构是应用程序能够识别并能对之做出响应的一组URL,当处理一个输入 请求时,路由系统的工作是将这 ...
- SQL varbinary varchar 互转
--============================================== -- FUNCTION varbin2hexstr -- 将 varbinary 类型的数据转换为 v ...
- DTL
DTL:Django模板语言(Django Template Language). 一.变量 1.视图函数可以通过两种方式将变量传递给模板页面: ① render(request, 'test_pag ...
- Altium Desgner软件,PCB设计中铺铜的作用
PS原文出自http://mp.weixin.qq.com/s/5mLNXzCDm1hGOXiKNE8Ddg 问1:为何要铺铜? 答:一般铺铜有几个方面原因. 1.EMC.对于大面积的地或电源铺铜,会 ...
- BZOJ.4572.[SCOI2016]围棋(轮廓线DP)
BZOJ 洛谷 \(Description\) 给定\(n,m,c\).\(Q\)次询问,每次询问给定\(2*c\)的模板串,求它在多少个\(n*m\)的棋盘中出现过.棋盘的每个格子有三种状态. \( ...
- redis -- python操作连接redis简单示例
1.先安装 redis,pyredis sudo pip install redis sudo pip install python-redis 2.示例: importredis >>& ...
- 潭州课堂25班:Ph201805201 django 项目 第二十五课 文章多级评论前后台实现 (课堂笔记)
添加新闻评论功能 1.分析 业务处理流程: 判断前端传的新闻id是否为空,是否为整数.是否不存在 判断评论的内容是否为空 判断是否有父评论,父评论的id是否与新闻id匹配 判断用户是否登录 保存新闻评 ...