这节讲资源和值转换器(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的更多相关文章

  1. .NET(C#):浅谈程序集清单资源和RESX资源

    原文:.NET(C#):浅谈程序集清单资源和RESX资源   目录 程序集清单资源 RESX资源文件 使用ResourceReader和ResourceSet解析二进制资源文件 使用ResourceM ...

  2. 【转】.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 ...

  3. Azure Terraform(八)利用Azure DevOps 实现Infra资源和.NET CORE Web 应用程序的持续集成、持续部署

    一,引言 上一篇讲解到利用 Azure DevOps 将整个 Azure Web App,Azure Traffic Manager profile,Azure Storage Account,Azu ...

  4. springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误。

    springMVC配置时,静态资源和jsp文件路径没错但是访问时controller的请求报404错误. 1.场景 如果在web.xml中servlet-mapping的url-pattern设置的是 ...

  5. HTTP协议------->资源和URL

    1.前言 最近在研究http,希望结合书本,对网上资料进行整合,用“人话”聊聊这个玩意儿- 计划用近十篇文章,详尽的说清楚以下一些问题: URL和资源.HTTP报文是什么东西? HTTP是怎样进行链接 ...

  6. k8s系列---ingress资源和ingress-controller

    https://www.cnblogs.com/zhangeamon/p/7007076.html http://blog.itpub.net/28916011/viewspace-2214747/ ...

  7. [已解决]从微软合作伙伴资源和MSDN下载系统和软件Microsoft download Manager无效

    有个itellyou,更新了所有MSDN的软件包.如果自己有微软的注册账户,还是从微软官网下载比较好.而且对自己账户里的系统和itellyou里的做了对比.发现SHA1码不相同,估计官方分配的序列号也 ...

  8. 【Unity Shaders】Shader学习资源和Surface Shader概述

    写在前面 写这篇文章的时候,我断断续续学习Unity Shader半年了,其实还是个门外汉.我也能体会很多童鞋那种想要学好Shader却无从下手的感觉.在这个期间,我找到一些学习Shader的教程以及 ...

  9. go 学习资源和GitHub库

    go httprouter 源码包 https://github.com/julienschmidt/httprouter 用例 https://github.com/gsingharoy/httpr ...

随机推荐

  1. 【Matlab】BASK的调试与解调仿真

    索引 一.BASK的调制 1.1 曼彻斯特码 1.2 增益控制 1.3 常量求和 1.4 与载波相乘 1.5 波形预览 1.6 参数设置(参考) 二.BASK的解调 2.1 滤波 2.2 信号比较 2 ...

  2. MySQL慢日志全解析

    前言: 慢日志在日常数据库运维中经常会用到,我们可以通过查看慢日志来获得效率较差的 SQL ,然后可以进行 SQL 优化.本篇文章我们一起来学习下慢日志相关知识. 1.慢日志简介 慢日志全称为慢查询日 ...

  3. 北航OO(2020)第三单元博客作业

    一.JML理论基础及相关工具链 1.JML理论基础 该部分梳理本单元作业中涉及到的JML知识. 1.1注释结构 JML采用javadoc注释的方式来表示规格,且每行以@开头.通过使用//@annota ...

  4. Java中对象池的本质是什么?(实战分析版)

    简介 对象池顾名思义就是存放对象的池,与我们常听到的线程池.数据库连接池.http连接池等一样,都是典型的池化设计思想. 对象池的优点就是可以集中管理池中对象,减少频繁创建和销毁长期使用的对象,从而提 ...

  5. jquery的入口函数 和 js和jq的转化

    先引入jq包 然后<script type="text/javascript"> $(function{ 获取标签:$('#box2') jq转为js:$('#box2 ...

  6. 技术干货 | 基于MindSpore更好的理解Focal Loss

    [本期推荐专题]物联网从业人员必读:华为云专家为你详细解读LiteOS各模块开发及其实现原理. 摘要:Focal Loss的两个性质算是核心,其实就是用一个合适的函数去度量难分类和易分类样本对总的损失 ...

  7. flink操作mysql

    Flink读写mysql 如果是mvn项目的话,需要预先导入相应的包: <dependency> <groupId>org.apache.flink</groupId&g ...

  8. 063.Python前端Django分页器

    Django的分页器 1 前期准备 创建一个数据库,用于存放数据 mysql> create database pager default charset=utf8; mysql> use ...

  9. C++ short/int/long/long long 等数据类型大小

    表 1 整型数据类型 数据类型 字节大小 数值范围 short int (短整型) 2 字节 -32 768 〜+32 767 unsigned short int(无符号短整型) 2 字节 0 〜+ ...

  10. JRebel插件使用详解(IDEA热部署)(Day_44)

    JRebel插件使用详解 简介 JRebel是一套JavaEE开发工具. Jrebel 可快速实现热部署,节省了大量重启时间,提高了个人开发效率. JRebel是一款JAVA虚拟机插件,它使得JAVA ...