当前位置: 首页 > news >正文

开发自己的IValueConverter

开发自己的IValueConverter

一、先搞懂:IValueConverter 是干嘛的?

一句话定义

IValueConverter = 数据绑定的「翻译官」

场景(你一定遇到过)

  • 后台数据是 数字 0/1 → 界面要显示 “男 / 女”
  • 后台数据是 bool true/false → 界面要显示 “启用 / 禁用”
  • 后台数据是 价格 99.9 → 界面要显示 “¥99.90”
  • 后台数据是 枚举 → 界面要显示 颜色 / 图片

核心作用

在数据 绑定到界面 的过程中,偷偷把值转换成你想要的样子!

二、开发自定义转换器的 4 个固定步骤

无论做什么转换器,步骤永远一样:

步骤 1:创建类,继承 IValueConverter 接口

步骤 2:实现 2 个方法

  • Convert():数据 → 界面 时调用(最常用)
  • ConvertBack():界面 → 数据 时调用(双向绑定用)

步骤 3:在 XAML 中声明为资源

步骤 4:在 Binding 中使用 Converter

三、超简单示例 1:布尔值 → 文字(true→启用 false→禁用)

我们从零写一个BoolToStringConverter

1. 编写转换器代码(C#)

 1 using System;
 2 using System.Globalization;
 3 using System.Windows.Data;
 4 using System.Windows.Markup;
 5 
 6 // 标记:可以直接在XAML中使用,无需声明资源
 7 [MarkupExtensionReturnType(typeof(BoolToStringConverter))]
 8 public class BoolToStringConverter : IValueConverter
 9 {
10     // 单例模式,全局只用一个实例,提升性能
11     private static BoolToStringConverter _instance;
12     public static BoolToStringConverter Instance => _instance ?? (_instance = new BoolToStringConverter());
13 
14     // 【核心方法】数据 → 界面
15     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
16     {
17         // 安全判断:值是不是bool类型
18         if (value is bool isEnabled)
19         {
20             // true → 返回"启用",false → 返回"禁用"
21             return isEnabled ? "启用" : "禁用";
22         }
23         return "未知";
24     }
25 
26     // 【核心方法】界面 → 数据(双向绑定时用)
27     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
28     {
29         // 这里我们不需要反向转换,直接返回true或抛出异常
30         return true;
31     }
32 }

2. XAML 中直接使用(超级简单)

1 <Window 
2     xmlns:local="clr-namespace:你的命名空间">
3 
4     <Grid>
5         <!-- 绑定一个Bool属性,并用转换器翻译 -->
6         <TextBlock Text="{Binding IsActive, Converter={x:Static local:BoolToStringConverter.Instance}}" />
7     </Grid>
8 </Window>

效果

  • 后台 IsActive = true → 界面显示 启用
  • 后台 IsActive = false → 界面显示 禁用
 

四、实战示例 2:数字 → 性别(0→男,1→女)

这是项目最常用的转换器!

1. 转换器代码

 1 public class GenderConverter : IValueConverter
 2 {
 3     private static GenderConverter _instance;
 4     public static GenderConverter Instance => _instance ?? (_instance = new GenderConverter());
 5 
 6     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 7     {
 8         if (value is int gender)
 9         {
10             return gender == 0 ? "" : "";
11         }
12         return "未知";
13     }
14 
15     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
16     {
17         // 文字转回数字
18         if (value.ToString() == "") return 0;
19         return 1;
20     }
21 }

2. 使用

1 <TextBlock Text="{Binding Gender, Converter={x:Static local:GenderConverter.Instance}}" />

五、超级实用示例 3:数字 → 颜色(成绩≥60→绿色,否则红色)

转换器代码

 1 public class ScoreToColorConverter : IValueConverter
 2 {
 3     public static ScoreToColorConverter Instance { get; } = new ScoreToColorConverter();
 4 
 5     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 6     {
 7         if (value is int score)
 8         {
 9             return score >= 60 ? Brushes.Green : Brushes.Red;
10         }
11         return Brushes.Black;
12     }
13 
14     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
15     {
16         throw new NotImplementedException();
17     }
18 }

使用

1 <TextBlock 
2     Text="{Binding Score}" 
3     Foreground="{Binding Score, Converter={x:Static local:ScoreToColorConverter.Instance}}" />

六、进阶:使用 ConverterParameter 传参

转换器可以接收参数,一个转换器顶多个用!

示例:数字 → 文字 + 单位(元、个、件)

 1 public class UnitConverter : IValueConverter
 2 {
 3     public static UnitConverter Instance { get; } = new UnitConverter();
 4 
 5     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 6     {
 7         // parameter 就是你传过来的参数
 8         return $"{value} {parameter}";
 9     }
10 
11     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
12     {
13         return value.ToString().Split(' ')[0];
14     }
15 }

使用(传参数)

1 <!-- 显示:99 元 -->
2 <TextBlock Text="{Binding Price, Converter={x:Static local:UnitConverter.Instance}, ConverterParameter=元}" />
3 
4 <!-- 显示:10 个 -->
5 <TextBlock Text="{Binding Count, Converter={x:Static local:UnitConverter.Instance}, ConverterParameter=个}" />

七、两个方法必须懂(核心原理)

1. Convert(数据 → 界面)

  • 什么时候调用?界面加载、数据更新时
  • 作用:把后台数据转成界面需要的值

2. ConvertBack(界面 → 数据)

  • 什么时候调用?界面控件值改变、双向绑定时
  • 作用:把界面输入的值转回后台数据类型

八、最简单的使用方式(推荐)

我上面用的是静态单例 + x:Static,这是最优写法:
  • 不用在 XAML 写资源
  • 不用创建实例
  • 直接用,性能最好
1 Converter={x:Static local:你的转换器.Instance}

九、完整开发模板(复制直接改)

以后写转换器,直接复制这段代码,改逻辑就行!
 1 using System;
 2 using System.Globalization;
 3 using System.Windows.Data;
 4 using System.Windows.Markup;
 5 
 6 [MarkupExtensionReturnType(typeof(MyConverter))]
 7 public class MyConverter : IValueConverter
 8 {
 9     public static MyConverter Instance { get; } = new MyConverter();
10 
11     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
12     {
13         // 在这里写:数据 → 界面 的转换逻辑
14         return value;
15     }
16 
17     public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
18     {
19         // 在这里写:界面 → 数据 的转换逻辑
20         return value;
21     }
22 }

十、核心总结(1 分钟记住)

  1. IValueConverter = 绑定翻译官
  2. 必须实现 2 个方法:Convert 和 ConvertBack
  3. 固定用法:Binding 中加 Converter={...}
  4. 解决:数据类型与界面显示不一致的问题
  5. 项目必备:布尔转文字、数字转性别、数字转颜色
http://www.jsqmd.com/news/539655/

相关文章:

  • 2026港校申请全攻略:硬核门槛解析与高端规划机构甄选 - 品牌2026
  • 2026机动车行人事故道路交通事故快速勘查系统厂商哪家好?怎么选更实用 - 品牌2026
  • 信号(signal)是“异步中断”,不能直接做复杂操作,异步中断是什么意思?
  • OpenClaw+GLM-4.7-Flash:自动化邮件处理系统搭建指南
  • 某鱼关键词搜索商品接口实战:合规调用 + 二手商品结构化解析(2026 最新版)
  • QRazyBox:5分钟快速修复损坏二维码的终极免费工具
  • 5步征服显存难题:多语言MiniLM模型量化优化实战指南
  • 全面对比:RTO设备生产企业的优势与特点 - 品牌推荐大师1
  • 喵飞AI深耕天津本土,OPC社区服务打通个人与企业AI落地堵点
  • 破解PS3手柄连接难题:BthPS3驱动3大突破点实现Windows 11完美适配
  • League-Toolkit 程序启动故障的 3 套分级解决方案
  • League-Toolkit:提升游戏体验的英雄联盟智能辅助工具集
  • 多平台网络资源捕获工具:突破下载限制的技术实现与场景化应用
  • 自动驾驶之心实习生招募|上海线下,一起做点真东西
  • 使用腾讯云 ClawPro 助手打造南京旅游攻略应用实践
  • 如何用Idle Master高效智能挂卡?Steam交易卡片自动收集全攻略
  • 拒绝“爆表”与“盲区”:青岛格林诺尔凭借20000ppm量程树立便携式VOC检测仪行业安全新防线 - 品牌推荐大师1
  • 【无人机控制】基于人工势场法的四旋翼无人机轨迹规划几何控制器附matlab代码
  • 2025年雀魂Mod工具终极指南:从痛点分析到实践探索
  • 破解AutoDock Vina金属对接难题:3种专业方案实战深度解析
  • Cisco交换机show arp命令实战:如何快速定位网络中的‘神秘设备’?
  • 中小团队 Openclaw 落地实战:选对中转,运维成本降 80%,调用成本砍半
  • DMG2IMG终极指南:3分钟掌握苹果DMG文件跨平台转换技巧
  • 【多机器人】基于搜索(CBS)框架结合时空 A 星算法实现栅格地图下的无冲突多机器人路径规划附matlab代码
  • Illustrator批量替换实战指南:用ReplaceItems释放设计效率
  • 5路HDMI编码器如何接入海康NVR?RTSP多通道配置保姆级教程
  • 从零开始学流程图:GESP C++二级考试中的三种基本结构详解
  • 高企申报代办别只看价格:常州企业容易踩的坑与实战经验拆解 - 企师傅推荐官
  • C++ 无原生 JSON 支持?一文实现通用序列化与反序列化封装方案
  • 三维空间动态避障路径规划:强化学习Q-Learning算法求解动态三维环境下无人机自主避障路径规划附MATLAB代码