深入浅出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中的地位 程序的本质是数据+算法.数据会在 ...
随机推荐
- WPF日积月累之文件监测与DataGrid指定Row的颜色
一.概述 关于DataGrid指定Row的颜色,我们可以使用转换器和DataGridRow的Style来实现.对于文件的检测,我们可以使用FileSystemWatcher来实现. 二.Demo Co ...
- java《设计原则-里氏替换原则》
package dubbo.wangbiao.project.ThreadAndSocket.designprinciples.lishitihuanyuanze.k0; //长方形 public c ...
- go实现堆排序
package main import "fmt" func main(){ arr:=[]int{4,8,2,1,6,9,3,5,7,8,1,4} dui(arr) fmt.Pr ...
- VSCode添加某个插件后,Python 运行时出现Segmentation fault (core dumped) 解决办法
在VSCode添加某个插件后,Debug出现Segmentation fault (core dumped) 解决方案,在当前environment下运行: conda update --all
- vue引用 element-ui 的 el-aside -> el-menu -> el-menu-item 路由侧边栏跳转链接,接上动态路由
npm 下载 npm i element-ui -S Vue main.js //引入element-ui的包 import ElementUI from 'element-ui'; //引入el ...
- QT程序打包成多平台可执行文件
一.简述 QT项目开发完成后,需要打包发布程序,在实际生产中不可能把源码发给别人,所以需要将源码打包正可执行文件或者安装程序. 二.设置应用图标 把 ico 文件放到源代码目录下,在QT项目中的'.p ...
- Docker - 解决 docker push 上传镜像报:denied: requested access to the resource is denied 的问题
问题背景 在 Linux 已登录自己的 Docker hub 账号 上传本地镜像但是报错了 docker push tomcat 解决方案 docker tag tomcat poloyy/tomca ...
- Redis集群的搭建及与SpringBoot的整合
1.概述 之前聊了Redis的哨兵模式,哨兵模式解决了读的并发问题,也解决了Master节点单点的问题. 但随着系统越来越庞大,缓存的数据越来越多,服务器的内存容量又成了问题,需要水平扩容,此时哨兵模 ...
- WinUI 3学习笔记(3)—— ComboBox & DropDownButton & SplitButton
本篇想介绍相对小众但颇具使用价值的控件SplitButton,提到SplitButton难免会拿来与ComboBox进行比较,同时在WinUI 3的控件库中,还有一个默默无闻的DropDownButt ...
- jmeter 参数化学习之CSV Data Set Config随机读取一行参数
需要使用到循环控制器,if控制器,CSV Data Set Config,Random Variable 4个组件 如图 先在线程组下面放一个随机数生成器 然后在同一层级设置一个永久的循环控制器,记住 ...