详解WPF中值转换器的使用方法

 更新时间:2024年02月11日 08:38:34   作者:Dm_dotnet  
在WPF(Windows Presentation Foundation)中,值转换器(Value Converter)是一种机制,允许你在绑定时转换绑定源和绑定目标之间的值,本文给大家介绍了WPF中值转换器的使用方法,需要的朋友可以参考下

什么是值转换器

在WPF(Windows Presentation Foundation)中,值转换器(Value Converter)是一种机制,允许你在绑定时转换绑定源和绑定目标之间的值。值转换器实现了 IValueConverter 接口,该接口包含两个方法:ConvertConvertBack。这两个方法分别用于在绑定源到目标时进行值转换,以及在目标到源时进行值转换。

使用值转换器的Demo

首先创建一个绑定数据源类:

using System;
using System.ComponentModel;
​
namespace BindConversion
{
    public class MyData : INotifyPropertyChanged
    {
        private DateTime _thedate;
​
        public MyData()
        {
            _thedate = DateTime.Now;
        }
​
        public DateTime TheDate
        {
            get { return _thedate; }
            set
            {
                _thedate = value;
                OnPropertyChanged("TheDate");
            }
        }
​
        // Declare event
        public event PropertyChangedEventHandler PropertyChanged;
        // OnPropertyChanged method to update property value in binding
        private void OnPropertyChanged(string info)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(info));
        }
    }
}

有一个类型为DateTime的属性TheDate,该类实现了INotifyPropertyChanged接口。

再创建一个转换器类:

using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
​
namespace BindConversion
{
    public class MyConverter : IValueConverter
    {
        public object Convert(object o, Type type,
            object parameter, CultureInfo culture)
        {
            var date = (DateTime) o;
            switch (type.Name)
            {
                case "String":
                    return date.ToString("F", culture);
                case "Brush":
                    return Brushes.Red;
                default:
                    return o;
            }
        }
​
        public object ConvertBack(object o, Type type,
            object parameter, CultureInfo culture) => null;
    }
}

该类实现了IValueConverter接口。

IValueConverter介绍

如果要将值转换器与绑定相关联,请创建实现 接口的 IValueConverter 类, Convert 然后实现 和 ConvertBack 方法。 转换器可以将数据从一种类型更改为另一种类型,根据文化信息转换数据,或修改演示文稿的其他方面。

值转换器具有区域性感知能力。 ConvertConvertBack 方法都有一个culture参数,用于指示区域性信息。 如果区域性信息与转换无关,则可以在自定义转换器中忽略该参数。

该接口有两个方法ConvertConvertBack

public object Convert (object value, Type targetType, object parameter, System.Globalization.CultureInfo culture);

中各参数的含义如下所示:

参数类型含义
valueobject绑定源生成的值。
targetTypeType绑定目标属性的类型。
parameterobject要使用的转换器参数。
cultureCultureInfo要用在转换器中的区域性。

再看一下MainWindow.xaml:

<Window x:Class="BindConversion.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:BindConversion"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <StackPanel Width="300" Height="300" Name="Page1">
        <StackPanel.Resources>
            <local:MyData x:Key="MyDataSource"/>
            <local:MyConverter x:Key="MyConverterReference"/>
            <Style TargetType="TextBlock">
                <Setter Property="FontSize" Value="15"/>
                <Setter Property="Margin" Value="3"/>
            </Style>
        </StackPanel.Resources>
​
        <StackPanel.DataContext>
            <Binding Source="{StaticResource MyDataSource}"/>
        </StackPanel.DataContext>
​
        <TextBlock Text="Unconverted data:"/>
        <TextBlock Text="{Binding Path=TheDate}"/>
        <TextBlock Text="Converted data:"/>
        <TextBlock Name="myconvertedtext"
    Foreground="{Binding Path=TheDate,
                         Converter={StaticResource MyConverterReference}}">
            <TextBlock.Text>
                <Binding Path="TheDate"
               Converter="{StaticResource MyConverterReference}"/>
            </TextBlock.Text>
        </TextBlock>
​
    </StackPanel>
</Window>

首先定义了资源:

  <StackPanel.Resources>
            <local:MyData x:Key="MyDataSource"/>
            <local:MyConverter x:Key="MyConverterReference"/>
            <Style TargetType="TextBlock">
                <Setter Property="FontSize" Value="15"/>
                <Setter Property="Margin" Value="3"/>
            </Style>
  </StackPanel.Resources>

一个名为MyDataSource类型为MyData的资源与一个名为MyConverterReference类型为MyConverter的资源。

我们发现有三处地方用到了Binding

  <Binding Source="{StaticResource MyDataSource}"/>

这种形式我们已经见过了。

  <TextBlock Name="myconvertedtext"
    Foreground="{Binding Path=TheDate,
                         Converter={StaticResource MyConverterReference}}">
  <Binding Path="TheDate"
               Converter="{StaticResource MyConverterReference}"/>

注意,这两处Binding中都出现了Converter

Converter介绍

通过实现 IValueConverter 接口并实现 Convert 方法创建转换器。 该方法应返回一个对象,该对象的类型与绑定所面向的依赖属性的类型相同,或者至少返回一个可隐式强制转换或转换为目标类型的类型。

再结合这段代码:

 public object Convert(object o, Type type,
     object parameter, CultureInfo culture)
 {
     var date = (DateTime) o;
     switch (type.Name)
     {
         case "String":
             return date.ToString("F", culture);
         case "Brush":
             return Brushes.Red;
         default:
             return o;
     }
 }

根据目标类型的不同,进行不同的转换。

TextBlock.Foreground的类型为Brush就返回Brushes.Red

TextBlock.Text的类型为String就返回date.ToString("F", culture)

结果如下图所示:

Demo代码来源

https://github.com/microsoft/WPF-Samples/tree/main/Data%20Binding/BindConversion

以上就是详解WPF中值转换器的使用方法的详细内容,更多关于WPF转换器使用的资料请关注脚本之家其它相关文章!

相关文章

  • C#中的多线程小试牛刀

    C#中的多线程小试牛刀

    这篇文章主要给大家介绍了关于C#中多线程的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C#具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-05-05
  • 解析在内部循环中Continue外部循环的使用详解

    解析在内部循环中Continue外部循环的使用详解

    本篇文章是对在内部循环中Continue外部循环的使用进行了详细的分析介绍,需要的朋友参考下
    2013-05-05
  • 使用C#改善代码质量的技巧和实践

    使用C#改善代码质量的技巧和实践

    本文将通过多个编程技巧和实践,展示如何显著改善代码质量,以 C# 为例,结合 卫语句、枚举、字典映射、单一职责原则 等技巧,逐步优化代码,感兴趣的小伙伴跟着小编一起来看看吧
    2025-03-03
  • C#使用Thrift作为RPC框架入门详细教程

    C#使用Thrift作为RPC框架入门详细教程

    这篇文件我们讲了从0到1使用thrift框架的方法,也讲了一些该框架的基本知识,本文将详细介绍 Thrift 在C#语言下的使用方式,并且提供丰富的实例代码加以解释说明,帮助使用者快速构建服务,感兴趣的朋友一起看看吧
    2021-11-11
  • 深入浅析C#中单点登录的原理和使用

    深入浅析C#中单点登录的原理和使用

    这篇文章主要介绍了C#中单点登录的原理和使用,需要的朋友可以参考下
    2017-10-10
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结
    2016-05-05
  • C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证

    C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证

    下面小编就为大家带来一篇C#进阶系列 WebApi身份认证解决方案推荐:Basic基础认证。小编觉得挺不错的,现在分享给大家。给大家一个参考。一起跟随小编过来看看吧
    2016-03-03
  • c# 实现观察者模式

    c# 实现观察者模式

    这篇文章主要介绍了c# 实现观察者模式的步骤,帮助大家更好的理解和使用c#实现设计模式,感兴趣的朋友可以了解下
    2021-01-01
  • C#实现以管理员方式启动程序的多种方法

    C#实现以管理员方式启动程序的多种方法

    在Windows应用程序开发的领域中,C#语言凭借其强大的功能和广泛的适用性,被众多开发者所青睐,然而,在实际的开发过程里,我们常常会遭遇程序需要访问特定的系统资源,像是系统文件夹、注册表项等,在接下来的内容中,我将为大家介绍在C#中实现以管理员方式启动程序的多种方法
    2025-01-01
  • C#集合之自定义集合类

    C#集合之自定义集合类

    这篇文章介绍了C#集合之自定义集合类,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-05-05

最新评论