Binding(三):资源和ValueConverter
这节讲资源和值转换器(ValueConverter)。
资源
在XAML中,我们想要使用外部的数据或者类,需要引入其命名空间,然后将其定义为XAML页面的资源,供给控件使用,或者我们需要封装一个共用的样式,同样也需要定义成资源来使用,下面我们看一下如何定义一个资源:
<Window.Resources>
<ResourceDictionary>
<sys:String x:Key="show">我是一个资源</sys:String>
<Style x:Key="styleShow" TargetType="Button">
<Setter Property="Background" Value="Purple" />
<Setter Property="Foreground" Value="White" />
</Style>
</ResourceDictionary>
</Window.Resources>
资源的类型是ResourceDictionary,顾名思义,资源是用键值对存储的,所以定义资源时需要给它个key,这个Key的value则根据定义资源的不同千变万化了,像上方代码中,定义一个string资源,它的value就是一个普通的字符串,定义一个样式资源,它的value就是一个定义样式的setter对象。
那定义资源后,如何使用呢,这就又要用到标记扩展语法了,请看下面的代码:
<StackPanel>
<Button Content="{StaticResource show}"
Style="{StaticResource styleShow}" />
</StackPanel>
使用StaticResource命令获取一个资源,后面接资源的key,我给这个button引入了上方定义的资源,运行效果如下:

另外,除了StaticResource,还有一个DynamicResource命令,StaticResource在程序一开始加载一次,如果资源中途变动,是不会再更新到使用它的控件上的,而DynamicResource则相反,它会跟着资源的更新而更新,所以要合理使用两者。
后台代码中,声明资源和获取资源就简单多了,代码如下:
this.Resources.Add("show", "我是个资源");//定义资源
object data = this.Resources["show"];
this.FindResource("show");
后台无非就是操作键值对集合,并且我们也可以使用FindResource方法来寻找资源。
ValueConverter
上节我们提到一个情景,将Button的显示与隐藏跟CheckBox是否选中做绑定,这个就需要用到我们接下来讲的ValueConverter。
首先我们需要新建一个类,代码如下:
class BoolToVisibilityConvert : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return DependencyProperty.UnsetValue;
if ((bool)value == true)
{
return Visibility.Visible;
}
else return Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return false;
if ((Visibility)value == Visibility.Visible)
{
return true;
}
else return false;
}
}
使用ValueConverter需要实现IValueConverter接口,其内部有两个方法,Convert和ConvertBack。我们在使用Binding绑定数据的时候,当遇到源属性和目标控件需要的类型不一致的,就可以使用ValueConverter,它就相当于一个桥,当数据从源到目标控件时,需要走Convert方法,我们在这个方法里边就可以自定义转换逻辑,当数据从目标控件到源时,需要走ConvertBack方法,我们可以在这里边自定义回转逻辑。
上述代码中,我就实现了Button的Visibility属性和bool之间的转换,下面我们需要将这个类作为资源,载入XAML页面,让Button使用,代码如下:
<Window.Resources>
<ResourceDictionary>
<local:BoolToVisibilityConvert x:Key="B2V" />
</ResourceDictionary>
</Window.Resources>
这个ValueConverter类的命名空间就是当前项目的命名空间,所以直接使用local即可,local是默认代表当前代码的命名空间简称,具体相关XAML命名空间的知识参见前文:剖析XAML语言。
XAML代码如下:
<StackPanel>
<CheckBox x:Name="CB" Click="CheckBox_Click" />
<Button
Content="{StaticResource show}"
Style="{StaticResource styleShow}"
Visibility="{Binding ElementName=CB, Path=IsChecked, Converter={StaticResource B2V}}" />
</StackPanel>
程序运行效果如下:


最后来解释一下转换方法的四个参数,第一个就是数据,我们要转换的值就是它,第二个参数是目标类型,当从bool转换为Visibility时,这个参数就是Visibility,反之则是bool,第三个参数是转换参数,可以在标记扩展中定义,第四个是文化参数,也是可以在扩展标记中定义,详见如下:
Visibility="{Binding ElementName=CB, Path=IsChecked, Converter={StaticResource B2V},ConverterParameter=true,ConverterCulture=zh-CN}"
第三个参数主要是提供一些转换上的辅助,带给我们用于转换的更多的信息,第四个我个人理解多用在国际化上,我们可以根据这个参数获取当前的语言环境,这两个都不是扩展属性,都不能使用标记扩展。

Binding(三):资源和ValueConverter的更多相关文章
- .NET(C#):浅谈程序集清单资源和RESX资源
原文:.NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- 【转】.NET(C#):浅谈程序集清单资源和RESX资源 关于单元测试的思考--Asp.Net Core单元测试最佳实践 封装自己的dapper lambda扩展-设计篇 编写自己的dapper lambda扩展-使用篇 正确理解CAP定理 Quartz.NET的使用(附源码) 整理自己的.net工具库 GC的前世与今生 Visual Studio Package 插件开发之自动生
[转].NET(C#):浅谈程序集清单资源和RESX资源 目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...
- Azure Terraform(八)利用Azure DevOps 实现Infra资源和.NET CORE Web 应用程序的持续集成、持续部署
一,引言 上一篇讲解到利用 Azure DevOps 将整个 Azure Web App,Azure Traffic Manager profile,Azure Storage Account,Azu ...
- springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。
springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...
- HTTP协议------->资源和URL
1.前言 最近在研究http,希望结合书本,对网上资料进行整合,用“人话”聊聊这个玩意儿- 计划用近十篇文章,详尽的说清楚以下一些问题: URL和资源.HTTP报文是什么东西? HTTP是怎样进行链接 ...
- k8s系列---ingress资源和ingress-controller
https://www.cnblogs.com/zhangeamon/p/7007076.html http://blog.itpub.net/28916011/viewspace-2214747/ ...
- [已解决]从微软合作伙伴资源和MSDN下载系统和软件Microsoft download Manager无效
有个itellyou,更新了所有MSDN的软件包.如果自己有微软的注册账户,还是从微软官网下载比较好.而且对自己账户里的系统和itellyou里的做了对比.发现SHA1码不相同,估计官方分配的序列号也 ...
- 【Unity Shaders】Shader学习资源和Surface Shader概述
写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...
- go 学习资源和GitHub库
go httprouter 源码包 https://github.com/julienschmidt/httprouter 用例 https://github.com/gsingharoy/httpr ...
随机推荐
- .NET之API版本控制
1. 优点 有助于保护原有系统,不受影响,并及时修改问题 可以实现用户的私人定制(比如是付费接口) 快速迭代 2. API版本控制 在URL中追加版本或者作为查询字符串参数 通过自动以标头和通过接受标 ...
- 2020中国大学生程序设计竞赛(CCPC) - 网络选拔赛总结
1003 Express Mail Taking 题意:有n个柜子(编号1-n),m封信,k号位置有钥匙,现在需要取信封,并且每取一次信封都要从k号位置进行领取一次钥匙,再去有信封的位置领取信封,问最 ...
- 透过“锁”事看InnoDB对并发的处理?
一. 并发场景下的问题 相对于串行处理方式,并发的事务处理可显著提升数据库的事务吞吐量.提高资源利用率.在MySQL实际应用中,根据场景的不同,可以分为以下几类: 读读并发 读写并发 写写并发 在这些 ...
- java中基本数据类型、包装类及字符串之间的相互转换
基本数据类型:不支持面向对象的编程机制(没有属性和方法),即不支持面向对象,之所以提供8中基本数据类型,是为了方便常规数据的处理. 包装类:通过包装类可以将基本数据类型的值包装为引用数据类型的对象,使 ...
- [DB] Spark Core (2)
RDD WordCount处理流程 sc.textFile("/root/temp/data.txt").flatMap(_.split(" ")).map(( ...
- [Linux] Linux命令行与Shell脚本编程大全 Part.3
Shell Shell 是管理命令行的程序(包在内核外的壳) 不同Shell版本演化关系如下,一般Linux中会自动安装Sh和Bash(Bash比Sh好写,Zsh最好用) .bashrc:Bash 的 ...
- [刷题] 203 Remove Linked List Elements
要求 在链表中删除值为val的所有节点 示例 如 1->2->3->4->5->6->NULL,要求删除值为6的节点 返回1->2->3->4-& ...
- IDEA 全局搜索 Jar 包中源码内容
引言 项目开发过程中,经常遇到需要在依赖的 Jar 包查看源码,查找类方法和属性,介绍两种在 IDEA 中搜索 Jar 包内容的方式 方式一:双击 SHIFT 快捷键 输入需要查询的类名或方法名 方式 ...
- redis的rehash过程
在扩容和收缩的时候,如果哈希字典中有很多元素,一次性将这些键全部rehash到ht[1]的话,可能会导致服务器在一段时间内停止服务.所以,采用渐进式rehash的方式,详细步骤如下: 为ht[1]分配 ...
- Canvas跟随鼠标炫彩小球
跟随鼠标炫彩小球 canvas没有让我失望,真的很有意思 实现效果 超级炫酷 实现原理 创建小球 给小球添加随机颜色,随机半径 鼠标移动通过实例化,新增小球 通过调用给原型新增的方法,来实现小球的动画 ...