WPF中的依赖属性绑定对象时,如果数据类型不一致,会发生数据转换,比如int 转string 等,这些WPF会帮我们做好,但是如果是比较负杂的类型,比如bool类型转换成 Visibility,就不行了。这时候我们需要自定义转换的类。
这里还是以一个自定义控件的示例来进行说明。
自定义控件调音台SingnalLight,实现功能(示例程序摘自鱼哥的地盘)

  • 接收来自外部的范围0~100的数值
  • 实时显示接收数值
  • 列表内容
  • 数值范围0~50显示绿色,50~85显示黄色,85~100显示红色,没有数值显示褐色
  • 可在父控件上拖拽该控件

    其中数值范围0~50显示绿色,50~85显示黄色,85~100显示红色,没有数值显示褐色这个功能就是使用的数据转换功能。以下是源代码

 public class SingnalLightStatusConverter : IValueConverter{public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){SolidColorBrush result = Brushes.Transparent;if (value.GetType() == typeof(int)){var color = System.Convert.ToInt32(value);if (color < 50) result = Brushes.Green;else if (color < 85 && color >= 50) result = Brushes.Yellow;else if (color <= 100 && color >= 85) result = Brushes.Red;else result = Brushes.Gray;}return result;}public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture){throw new NotImplementedException();}}

需要实现IValueConverter接口。我们来看一下,.NET中是如何对IValueConverter接口进行说明的。

 //// 摘要://     提供一种将自定义逻辑应用于绑定的方式。public interface IValueConverter{//// 摘要://     转换值。//// 参数://   value://     绑定源生成的值。////   targetType://     绑定目标属性的类型。////   parameter://     要使用的转换器参数。////   culture://     要用在转换器中的区域性。//// 返回结果://     转换后的值。如果该方法返回 null,则使用有效的 null 值。object Convert(object value, Type targetType, object parameter, CultureInfo culture);//// 摘要://     转换值。//// 参数://   value://     绑定目标生成的值。////   targetType://     要转换到的类型。////   parameter://     要使用的转换器参数。////   culture://     要用在转换器中的区域性。//// 返回结果://     转换后的值。如果该方法返回 null,则使用有效的 null 值。object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture);

最后我们来看如何使用自定义的数据转换功能,以下是自定义SingnalLight的xaml文件。

    <Style TargetType="{x:Type local:SingnalLight}"><Setter Property="RenderTransform"><Setter.Value><TranslateTransform X="{Binding Path=X,RelativeSource={RelativeSource AncestorType={x:Type local:SingnalLight}}}"Y="{Binding Path=Y,RelativeSource={RelativeSource AncestorType={x:Type local:SingnalLight}}}"/></Setter.Value></Setter><Setter Property="Template"><Setter.Value><ControlTemplate><ControlTemplate.Resources><local:SingnalLightStatusConverter x:Key="colorconverter"></local:SingnalLightStatusConverter><local:SingnalLightValueConverter x:Key="valueconverter"></local:SingnalLightValueConverter></ControlTemplate.Resources><StackPanel><TextBlock Text="{Binding Path=ValueA,RelativeSource={RelativeSource AncestorType={x:Type local:SingnalLight}}}"></TextBlock><TextBlock Text="100"></TextBlock><Border   x:Name="bd1"Height="{Binding Path=LightHeight,RelativeSource={RelativeSource AncestorType={x:Type local:SingnalLight}}}"SnapsToDevicePixels="True"BorderBrush="Black" BorderThickness="1" Background="Transparent"><Rectangle Fill="{Binding Path=ValueA,RelativeSource={RelativeSource AncestorType={x:Type local:SingnalLight}},Converter={StaticResource ResourceKey=colorconverter}}" VerticalAlignment="Bottom"><Rectangle.Height><MultiBinding Converter="{StaticResource ResourceKey=valueconverter}"><Binding Path="ValueA" RelativeSource="{RelativeSource AncestorType={x:Type local:SingnalLight}}"></Binding><Binding Path="Height" ElementName="bd1"></Binding></MultiBinding></Rectangle.Height></Rectangle></Border><TextBlock Text="0"></TextBlock></StackPanel></ControlTemplate></Setter.Value></Setter></Style>

很明显可以看出来自定义的数据转换相当与资源的一种。在绑定的时候,增加一个Converter节点即可。

<Rectangle Fill="{Binding Path=ValueA,RelativeSource={RelativeSource AncestorType={x:Type local:SingnalLight}},Converter={StaticResource ResourceKey=colorconverter}}" 

WPF系列(二)数据转换相关推荐

  1. 算法系列(二):贪心算法--Huffman编码

    算法系列(二):贪心算法--Huffman编码 一.分析 问题描述: 哈夫曼编码是广泛地用于数据文件压缩的十分有效的编码方法.其压缩率通常在20%-90%之间.哈夫曼编码算法使用字符在文件中出现的频率 ...

  2. yolov8系列(二)-训练自己的目标分割模型,并web部署

    yolov8系列[二]-训练自己的目标分割模型,并web部署 0. 系统效果展示 1. yolov8训练高压电线覆冰模型 1.1. 制作高压电线覆冰数据 1.2. 数据转换成yolo格式数据 1.3. ...

  3. 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+kibanaV5.4.2+x-packV5.4.2安装

    相关博文: 搜索引擎ElasticSearchV5.4.2系列一之ES介绍 搜索引擎ElasticSearchV5.4.2系列二之ElasticSearchV5.4.2+klanaV5.4.2+x-p ...

  4. 【C++自我精讲】基础系列二 const

    [C++自我精讲]基础系列二 const 0 前言 分三部分:const用法.const和#define比较.const作用. 1 const用法 const常量:const可以用来定义常量,不可改变 ...

  5. 一起学WPF系列(2):第一个WPF应用程序

    概述 Windows Presentation Foundation (WPF) 是下一代显示系统,用于生成能带给用户震撼视觉体验的 Windows 客户端应用程序.使用 WPF,您可以创建广泛的独立 ...

  6. 人工智能算法通俗讲解系列(二):逻辑回归

    2019独角兽企业重金招聘Python工程师标准>>> 今天,我们介绍的机器学习算法叫逻辑回归.它英语名称是Logistic Regression,简称LR. 跟之前一样,介绍这个算 ...

  7. 【算法系列 二】Stack

    为什么80%的码农都做不了架构师?>>>    栈应用的场景: 1.括号问题 2.后缀表达式 3.深度优先遍历 4.保存现场 1. 给定字符串,仅由"()[]{}" ...

  8. 《CDN 之我见》系列二:原理篇(缓存、安全)

    2019独角兽企业重金招聘Python工程师标准>>> <CDN之我见>共由三个篇章组成,分为原理篇.详解篇和陨坑篇.本篇章适合那些从未接触过.或仅了解一些 CDN 专业 ...

  9. SEO系列二:何为用户体验?如何做好用户体验?

    昨天写了一篇<SEO系列一:SEO是什么?SEO有什么意义?>的文章,受到了汇道童鞋们的支持和鼓舞,周珍在这里和大家说声谢谢.甚至还有童鞋说期待我写到SEO系列2000,是否能写到2000 ...

  10. 一步步构建多层架构系列二之设计模式运用篇

    上节我们讲到数据对象创建的管理,那么如何管理数据访问类的对象创建呢?先从为什么需要设计模式的原理说起吧 为了更好的理解设计思想,我尽可能的用实例来演示推进.但随着需求的增加,程序将越来越复杂.此时就有 ...

最新文章

  1. 基于圆形标定点的相机几何参数的标定
  2. bzoj4154[Ipsc2015]Generating Synergy
  3. linux中的定时,linux中的定时任务
  4. 报错引发的版本对应——tensorflow+keras+python版本对应(全)
  5. 语言主程序和子程序的写法_汇编语言程序设计第三篇——汇编程序结构
  6. java 死锁的检测与修复_调查死锁–第4部分:修复代码
  7. 使用HTML5和JavaScript创建音乐播放列表
  8. jinja Template Synopsis
  9. 调试错误解决方案之VC++
  10. http://www.eoeandroid.com
  11. Android MeasureSpec详解
  12. JavaWeb项目打包上线简单流程
  13. Python + Selenium自动化测试
  14. 成本会计的概念、产品成本核算的要求、产品成本核算的对象与成本项目、产品成本的归集和分配(可能考判断)、产品成本计算方法 (三种:产品的品种(品种法),批次(分批法),步骤(分步法))
  15. 北邮计算机考试大纲,北邮考试大纲
  16. 海贼王热血航线正在连接服务器,海贼王热血航线为什么连接不了服务器?老是说人已满进不去?...
  17. ArcGIS学习总结(三)——空间分析基本操作
  18. VMware Workstation(vm虚拟机)
  19. Linux里面 update 和 upgrade 的区别
  20. java ffmpeg 合并视频_ffmpeg 合并拼接 mp4视频

热门文章

  1. axure9总是崩_axure9为何用着特别卡?
  2. 一阶差分序列garch建模_时间序列模型stata 基本命令汇总
  3. VisualStudio编程好用舒适的字体Fira Code如=gt;连字
  4. 利用SPSS进行PSM倾向性评分配对
  5. js自动触发点击事件
  6. SSM+老年人活动信息管理系统 毕业设计-附源码121730
  7. 【Keras-ResNet】CIFAR-10
  8. mac配置flutter一条龙
  9. 变频器内部有C语言吗,总结变频器的常用算法,看看你是不是都知道
  10. 从数据中进行学习-基础知识