深入浅出WPF-06.Binding(绑定)02
Binding对数据的校验和转换
1)数据校验,通过Binding的ValidationRules属性(Collection类型)进行校验。可以设置多个数据校验条件。
<Slider Margin="5" Maximum="100" Minimum="0" SmallChange="1" x:Name="silder1">
<Slider.Value>
<Binding Path="CurrentValue">
<Binding.ValidationRules>
<local:MyValidationRule/>
</Binding.ValidationRules>
</Binding>
</Slider.Value>
</Slider>
public class MyValidationRule : ValidationRule
{
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
if (value != null && value is double input)
{
if (input > 0 && input < 100)
{
return new ValidationResult(true, null);
}
}
return new ValidationResult(false, "can not null");
}
}
ValidationRule是个抽象类,使用的时候需要创建他的派生类并实现Validate方法。如果通过校验,就把ValidationResult对象的IsValid属性设为true,否则设为false,并设置ErrorContent的消息内容。
校验的默认行为是认为来自于Source的数据总是正确的,只有来自目标Target的数据才可能出问题(Target多为UI控件,多数是用户输入的数据),为了就是不让输入的数据污染Source数据,所以才进行校验。Binding只有在Target被外部方法更新时才会校验(手动输入)。如果想在Source数据更新时Target也进行校验,需要将校验条件的ValidatesOnTargetUpdated设置为true。
当校验错误的时候Validate方法返回的ValidationResult对象,携带的错误信息如何显示?需要用到后面的知识---路由事件(EventRouted)。
如果Binding对象的NotifyOnValidationError="True",这时,当数据校验错误的时候Binding会像报警器一样发出一个信号,这个信号以Target为起点,沿着树进行传播,直到某个节点监听并处理了这个信号。信号处理完之后,可以决定这个信号是继续传播,还是终止(e.Handled = true;)。这就是路由事件,传递这个信号的过程叫做路由。
private MainWindowViewModel model = new MainWindowViewModel();
public Window1()
{
InitializeComponent();
this.DataContext = model;
this.silder1.AddHandler(Validation.ErrorEvent, new RoutedEventHandler(ValidationError));
}
void ValidationError(object sender, RoutedEventArgs e)
{
if (Validation.GetErrors(this.silder1).Count > 0)
{
//处理错误信息
e.Handled = true;
}
}
2)数据转换,当源Source端的Path所关联的数据与Target端目标属性数据展示不一致时,我们就可以通过添加数据转换器来实现。比如最常用的性别,在数据源Source端一般使用枚举值,Target端一般使用字符串或者图片来区分,这是我们就可以使用转换器来实现。
xaml代码:
<TextBlock Margin="5" Height="23" Text="{Binding SexType, Converter={StaticResource DtoShowStringConverter}}"/>
性别枚举值:
/// <summary>
/// 性别
/// </summary>
public enum SexType : byte
{
/// <summary>
/// 女
/// </summary>
Female = 0,
/// <summary>
/// 男
/// </summary>
Male = 1,
/// <summary>
/// 未知
/// </summary>
Null = 2
}
转换器:
public class DtoShowStringConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null) return null;
string output = null;
if (value is SexType input)
{
switch (input)
{
case SexType.Female:
output = "女";
break;
case SexType.Male:
output = "男";
break;
case SexType.Null:
output = "未知";
break;
default:
break;
}
}
return output;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
当数据从Source流向Target时,Convert方法被调用,反之,ConvertBack被调用。第一个参数是传入的值,第二个参数是返回的值的类型,第三个参数是用来传递额外信息的(对应的Binding中的ConverterParameter)。我们最常用的是Source流向Target(Convert方法),极少使用ConvertBack。
深入浅出WPF-06.Binding(绑定)02的更多相关文章
- 深入浅出WPF之Binding的使用(一)
在WPF中Binding可以比作数据的桥梁,桥梁的两端分别是Binding的源(Source)和目标(Target).一般情况下,Binding源是逻辑层对象,Binding目标是UI层的控件对象:这 ...
- 深入浅出WPF之Binding的使用(二)
在上一篇中介绍了Binding的基本绑定方法,这一篇中我们在深入的介绍Binding的其他用法. Binding的源也就是数据的源头,在日常的工作中,除了使用像上一篇中的Student对象作为数据源外 ...
- [转]深入浅出WPF(7)——数据的绿色通道,Binding
本文转自:http://liutiemeng.blog.51cto.com/120361/95273 小序: 怎么直接从2蹦到7啦?!啊哦,实在是不好意思,最近实在是太忙了,忙的原因也非常简单——自己 ...
- 《深入浅出WPF》重点摘要(—)Binding自动通知机制
最近因为公司的项目需要用WPF开发,就学习了一下WPF.刚开始只是用到什么就百度什么,虽然功能是实现了,但还是没有弄清楚原理(如果不弄清原理,会感觉很心虚,整个人会没底气),所以决定找个教程系统地学一 ...
- WPF之Binding初探
初学wpf,经常被Binding搞晕,以下记录写Binding的基础. 首先,盗用张图.这图形象的说明了Binding的机理. 对于Binding,意思是数据绑定,基本用法是: 1.在xmal中使用 ...
- 深入浅出WPF(1)—转(http://liutiemeng.blog.51cto.com/120361/91631/)
深入浅出WPF(1)——什么是WPF 2008-05-15 19:06:00 小序: Hi,大家好!几乎两个月没有写技术文章了.这两个月,我在学习WPF.回顾一下两个月的学习历程,有两个感觉— ...
- WPF之Binding对数据的转换(第五天)
Binding在Slider控件与TextBox控件之间建立关联,值可以互相绑定,但是它们的数据类型是不同的,Slider是Double类型,Text为String.原来,Binding有一种机制称为 ...
- WPF学习:绑定
原文 http://www.cnblogs.com/SouthAurora/archive/2010/06/30/1768464.html 一.绑定到元素对象 1.元素和元素(XAML.代码) 1.1 ...
- 《深入浅出WPF》笔记——模板篇
原文:<深入浅出WPF>笔记--模板篇 我们通常说的模板是用来参照的,同样在WPF中,模板是用来作为制作控件的参照. 一.认识模板 1.1WPF菜鸟看模板 前面的记录有提过,控件主要是算法 ...
- WPF之Binding深入探讨
原文:http://blog.csdn.net/fwj380891124/article/details/8107646 1,Data Binding在WPF中的地位 程序的本质是数据+算法.数据会在 ...
随机推荐
- nuxt.js服务端渲染中less的配置和使用
第一步:npm 安装 less 和 less-loader ,文件根目录下安装,指令如下 npm install less less-loader --save-dev 第二步:直接在组件中使用 &l ...
- 狂神说SpringBoot02:运行原理初探
狂神说SpringBoot系列连载课程,通俗易懂,基于SpringBoot2.2.5版本,欢迎各位狂粉转发关注学习. 微信公众号:狂神说(首发) Bilibili:狂神说Java(视频) 未经作 ...
- python下 conda命令手册
0.说明: 对于tensorflow配合keras使用,因为linux服务器没有root权限,所以目前最高可用版本是 1.6.0,否则就会报错某些 so找不到 conda install -n xu ...
- Redis(三):新数据类型
配置文件redis.conf详解 bind=127.0.0.1 # 表示只能在本机中访问redis,将该行注释掉,即可接收任何IP地址的访问 protected-mode # 设置为no,表示关闭保护 ...
- Linux centos7 -bash: pstree: 未找到命令
2021-08-12 1. 命令简介pstree命令将所有行程以树状图显示,树状图将会以 pid (如果有指定) 或是以 init 这个基本行程为根 (root),如果有指定使用者 id,则树状图会只 ...
- 【XSS】XSS修炼之独孤九剑
题目地址 xcao.vip/test 题目作者给出的解题思路 http://xcao.vip/test/xss/XSS修炼之独孤九剑.pdf 独孤九剑-第一式 题目 过滤了等号 =.小括号 (),要求 ...
- 如何实现 Android 短视频跨页面的流畅续播?
在一切皆可视频化的今天,短视频内容作为移动端产品新的促活点,受到了越来越多的重视与投入,同时短视频也是增加用户粘性.增加用户停留时长的一把利器.那么如何快速实现移动端短视频功能呢?前两篇我们介绍了盒马 ...
- MongoDB 常见问题 - 解决找不到 mongo、mongod 命令的问题
问题背景 成功安装 MongoDB 后执行 Mongo.MongoD 显示找不到命令 解决方案 echo 'export PATH="/usr/local/opt/mongodb-commu ...
- MacOS安装和卸载Java
安装java 下载地址:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html 设 ...
- 比年轻更年轻,快看能否接棒B站?
撰文 |懂懂 编辑 | 秦言 来源:懂懂笔记 背靠超新Z世代,快看能否接棒B站? 国漫什么时候能追上日漫? 国漫作者真能挣到钱吗? 国漫什么时候才能走向世界? 这是中国漫画从业者的"灵魂三问 ...