0

0

[UWP]了解IValueConverter

雪夜

雪夜

发布时间:2025-09-06 09:14:17

|

230人浏览过

|

来源于php中文网

原创

  1. 前言

ivalueconverter是数据绑定中的强大工具,用于在binding source和binding target之间转换值。本文将详细介绍ivalueconverter的使用方法及一些常见的实现。

  1. 为什么要使用IValueConverter

假设有一个名为TestResult的类:

public class TestResult
{
    public bool Passed { get; set; }
}

UI需要根据Passed属性的值来决定结果文本的颜色是红色还是绿色。初学者通常会通过修改TestResult类,添加一个与Passed相关的属性来实现:

public class TestResult
{
    public bool Passed { get; set; }
    public Brush TestResultBrush
    {
        get
        {
            if (Passed)
                return new SolidColorBrush(Colors.Red);
            else
                return new SolidColorBrush(Colors.Green);
        }
    }
}

然后在XAML中绑定到这个属性:

另一种方法是直接在Code Behind中为TextBlock更改Foreground:

var testResult = DataContext as TestResult;
if (testResult != null)
{
    if (testResult.Passed)
        ResultElement.Foreground = new SolidColorBrush(Colors.Red);
    else
        ResultElement.Foreground = new SolidColorBrush(Colors.Green);
}

这两种方法都不够优雅,会带来一系列问题:破坏了TestResult的结构,违反了开放封闭原则,导致UI和数据过度耦合,存在过多的硬编码等。

在这种情况下,通常可以使用IValueConverter来处理。在Binding中,IValueConverter可以将数据在呈现前转换为新的目标值。实现IValueConverter需要执行以下步骤:

  • 创建一个实现了IValueConverter接口的类;
  • 实现
    public object Convert(object value, Type targetType, object parameter, string language)
    方法,该方法将数据转换为新目标值;
  • 实现
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    方法,该方法执行反向转换,仅在使用双向绑定时需要实现。

在这个例子中,IValueConverter的目的是将bool类型的Passed转换为Brush,实现如下:

public class BoolToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is bool passed)
            return new SolidColorBrush(passed ? Colors.Green : Colors.Red);
        return null;
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

在XAML中使用这个Converter需要先将其定义为Resource,然后在Binding中指定Converter到这个已定义的Resource:


    
        
    
    
  1. BoolToValueConverter

在XAML的漫长历史中,IValueConverter衍生出了一些奇妙的技巧,其中最常用的是BoolToValueConverter。

public class BoolToValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value == null || (bool) value == false)
            return DependencyProperty.UnsetValue;
        return parameter;
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        return Equals(value, parameter);
    }
}

BoolToValueConverter灵活使用了Binding中的ConverterParameter和FallbackValue两个参数,常用于解决IValueConverter中硬编码的问题。在Binding中,FallbackValue指明了如果Binding无法返回任何值时使用的值,在IValueConverter中返回DependencyProperty.UnsetValue即告诉Binding要使用FallbackValue的值。

使用BoolToValueConverter解决了上述例子的硬编码问题,在XAML中使用如下:


    
        
    
    
  1. BoolToObjectConverter

需要注意的是,上述XAML中的Green和Red只是字符串,它们最终能被解析成SolidColorBrush是由于TypeConverter的支持。也就是说,上述XAML语法只能用于TypeConverter支持的数据类型,而且这种写法仍然过于硬编码。如果要支持复杂类型或本地化等问题,可以将ConverterParameter和FallbackValue绑定到StaticResource:


    
    
    

尽管这种方法看似很灵活,但如果有大量返回相同值的BoolToValueConverter,将会使XAML产生大量冗余。UWP Community Toolkit提供了一些常用的IValueConverter实现,其中最常用的是BoolToObjectConverter。BoolToObjectConverter和BoolToValueConverter功能类似,但它提供了

public object TrueValue { get; set; }
public object FalseValue { get; set; }
两个属性,而且这两个属性是依赖属性,可以使用绑定为其赋值。使用如下:


    
    
    

  1. BoolToVisibilityConverter

UWP Community Toolkit中提供了另一个常用的Converter:BoolToVisibilityConverter。这个Converter只是简单地继承了BoolToObjectConverter,并且为TrueValue和FalseValue设置了默认值:

public BoolToVisibilityConverter()
{
    TrueValue = Visibility.Visible;
    FalseValue = Visibility.Collapsed;
}

BoolToVisibilityConverter虽然简单,但确实好用。不过,从1607版本之后就不需要这个Converter了,微软是这样说的。

但有时候反而需要True对应Collapsed,于是现在是另一个常用Converter - BoolNegationConverter登上历史舞台的时候了:


    
        
    
    
    
  1. StringFormatConverter

UWP的Binding缺少了StringFormat,这对Binding产生了很大影响。为了弥补这个缺陷,可以使用UWP Community Toolkit中的StringFormatConverter。它的代码也十分简单(其实这才是ConverterParameter的正确用法):

public object Convert(object value, Type targetType, object parameter, string language)
{
    if (value == null)
    {
        return null;
    }
    if (parameter == null)
    {
        return value;
    }
    return string.Format((string)parameter, value);
}

在XAML中使用如下:


结果如下:

[UWP]了解IValueConverter

除了弥补StringFormat的功能,StringFormatConverter还有其他应用场景。

TestModel.CS

public IEnumerable ClickModes => new List { ClickMode.Hover, ClickMode.Press, ClickMode.Release };

    
        
            
        
    

在WPF中,以上XAML都可以正常呈现,而在UWP中,以上XAML显示如下:

[UWP]了解IValueConverter

百度AI开放平台
百度AI开放平台

百度提供的综合性AI技术服务平台,汇集了多种AI能力和解决方案

下载

这种情况可以使用StringFormatConverter显示枚举的名称:


    
        
            
        
    

[UWP]了解IValueConverter

可以说对UWP来说,StringFormatConverter十分必要。

  1. language参数

public object Convert(object value, Type targetType, object parameter, string language)
方法中的参数language通常用于本地化,例如可以创建一个DateTimeValueConverter:

public class DateTimeValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is DateTime dateTime)
        {
            var culture = new CultureInfo(language);
            return dateTime.ToString(culture.DateTimeFormat);
        }
        return value;
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

结果如下:

[UWP]了解IValueConverter

  1. targetType参数

targetType参数指转换后的目标类型,使用这个参数可以实现一个简单的Value Converter:

public class ValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        return System.Convert.ChangeType(value, targetType);
    }
    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}

虽然代码简单,但它可以解决不少问题,例如《了解TypeConverter》这篇文章里提到的不能在XAML中使用decimal的问题。IValueConverter要起作用依赖于BindingSource,而在XAML中虽然很多东西都可以用来做BindingSource,例如用元素自己的Tag:

或者Resources中的字符串:


    10.01

或者更进一步写一个字符串的包装类:

public class StringWrapper
{
    public string this[string key]
    {
        get
        {
            return key;
        }
    }
}
  1. 使用IValueConverter的其它经验

9.1 统一管理IValueConverter

由于大部分IValueConverter行为是固定的,通常我都会把常用的IValueConverter放到一个Converters.xaml,然后在App.xaml中合并资源字典,这样不用重复写创建Converter的xaml,也避免了重复创建Converter的资源消耗:


    
        
            
        
    

9.2 格式化

[UWP]了解IValueConverter

Binding最让人诟病的缺点就是它的语法太长,例如以上两个TextBlock,在IDE中很难判断它们有什么不同。很多时候我都会把XAML的格式化设置成“将每个属性分行放置”,如下图:

[UWP]了解IValueConverter

这样上面两个TextBlock的XAML就清晰许多了:

[UWP]了解IValueConverter

不过这样设置也并不全是好处,怎么设置具体还是看个人喜好和屏幕尺寸。

  1. 结语

虽然IValueConverter的文章已经不少了,但还是常常见到乱来的IValueConverter实现,而且UWP的IValueConverter有一些改变,所以还是写了这篇文章。

我很想写一些常用的,或者容易用错的基础知识,但连IValueConverter都不知不觉就写得这么长了,实在没勇气写Binding的概念,何况关于Binding已经有很多很实用的文章。

我十分清楚文章写得太长就会被“保存到Pocket”,我也想每篇文章都能在三五分钟内看完,但偏偏越基础的概念就越能写得长,而且写得简短些又会被移出博客园首页,很难把握尺度。

下一篇文章会尽量写短一些。

  1. 参考
  • IValueConverter Interface
  • Binding Class
  • 深入了解数据绑定
  • Converters - UWP Community Toolkit _ Microsoft Docs

相关专题

更多
数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

307

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

222

2025.10.31

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

resource是什么文件
resource是什么文件

Resource文件是一种特殊类型的文件,它通常用于存储应用程序或操作系统中的各种资源信息。它们在应用程序开发中起着关键作用,并在跨平台开发和国际化方面提供支持。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

150

2023.12.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

258

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

212

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1468

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

621

2023.11.24

AO3中文版入口地址大全
AO3中文版入口地址大全

本专题整合了AO3中文版入口地址大全,阅读专题下面的的文章了解更多详细内容。

1

2026.01.21

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 7.5万人学习

Excel 教程
Excel 教程

共162课时 | 12.7万人学习

PHP基础入门课程
PHP基础入门课程

共33课时 | 2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号