WPF中值转换器的使用

简介: 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);

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

参数 类型 含义
value object 绑定源生成的值。
targetType Type 绑定目标属性的类型。
parameter object 要使用的转换器参数。
culture CultureInfo 要用在转换器中的区域性。

再看一下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代码来源

[WPF-Samples/Data Binding/BindConversion at main · microsoft/WPF-Samples⁤ (github.com)](https://github.com/microsoft/WPF-Samples/tree/main/Data Binding/BindConversion)

目录
相关文章
|
C# 前端开发
WPF如何得到一个在用户控件内部的元素的坐标位置
原文:WPF如何得到一个在用户控件内部的元素的坐标位置 例如有这样一个用户控件: 这是主窗口: ...
1419 0
|
IDE 编译器 C#
WPF实现强大的动态公式计算
数据库可以定义表不同列之间的计算公式,进行自动公式计算,但如何实现行上的动态公式计算呢?行由于可以动态扩展,在某些应用场景下将能很好的解决实际问题。本文就探讨一下如何在WPF中实现一种基于行字段的动态公式计算。
1056 0
WPF实现强大的动态公式计算
|
C#
WPF中的3D变换PlaneProjection
原文:WPF中的3D变换PlaneProjection 在UWP中有一个比较好用的伪3D变换PlaneProjection,可以以一种轻量级和非常简单的方式实现3D的效果。这种效果在Silverlight中也有这种变换,但在WPF中确一直没有提供。
900 0
|
C# 前端开发
WPF,SilverLight中直线的样式示例
原文:WPF,SilverLight中直线的样式示例 XAML代码:// LineStyle.xaml                                                           ...
711 0
|
C# API
深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例
原文:深入WPF中的图像画刷(ImageBrush)之1——ImageBrush使用举例 昨天我在《简述WPF中的画刷(Brush)  》中简要介绍了WPF中的画刷的使用。
2065 0
|
C# Windows
给WPF示例图形加上方便查看大小的格子
原文:给WPF示例图形加上方便查看大小的格子 有时,我们为了方便查看WPF图形的样式及比例等,需要一些辅助性的格线,置于图形、图像的背景中。
1084 0
|
XML C# 数据格式
XAML属性赋值转换之谜(WPF XAML语法解密)
原文:XAML属性赋值转换之谜(WPF XAML语法解密) XAML与XML类似,就是XML延伸过来的。为了更好的表达一些功能,WPF对XML做了扩展,有些功能是WPF在后台悄悄的替你做了。有时候,虽然实现了某个功能,但是对实现原理还是很茫然。
953 0
|
C#
WPF 实现测量显示文本长度
原文:WPF 实现测量显示文本长度 以工具类的方式实现: using System; using System.
940 0
|
C#
WinForm和WPF颜色对象的转换
原文:WinForm和WPF颜色对象的转换 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huangli321456/article/details/52956846 ...
870 0
|
C#
WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆)
原文:WPF 中使用附加属性,将任意 UI 元素或控件裁剪成圆形(椭圆) 版权声明:本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:http://blog.csdn.net/wpwalter/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
1255 0