WPF中值转换器的使用

news/2024/9/8 13:02:43

什么是值转换器

在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 eventpublic event PropertyChangedEventHandler PropertyChanged;// OnPropertyChanged method to update property value in bindingprivate 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介绍

image-20240208113026438

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

值转换器具有区域性感知能力。 Convert和 ConvertBack 方法都有一个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介绍

image-20240208115242355

通过实现 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)

结果如下图所示:

image-20240208115712929

Demo代码来源

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.cpky.cn/p/8029.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

简单的TcpServer(英译中)

目录 一、TCP socket API 详解1.1 socket()1.2 bind()1.3 listen()1.4 accept()1.5 connect 二、TcpServer&#xff08;英译中&#xff09;2.1 TcpServer.hpp2.2 TcpClient.cc2.3 Task.hpp2.4 Thread.hpp2.5 ThreadPool.hpp2.6 makefile2.7 Main.cc2.8 log.hpp2.9 Init.hpp2.10…

分享3款开源免费好用的Docker可视化管理工具安装部署教程

文章目录 1.前言2.Docker Desktop3.Portainer3.1 Portainer默认英文版本安装3.2 Portainer汉化版本安装3.3官方镜像说明3.3.1ssl访问3.3.2Nginx反代3.3.3Nginx反代设置子目录3.3.4docker-compose部署 3.4登录 4.DockerUI4.1简介4.2项目地址4.3部署启动命令4.4登录4.5首页 5.总结…

Spring IoC容器详解

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl 基本概念 Spring IoC容器是Spring框架的核心组件&#xff0c;它实现了控制反转&#xff08;Inversion of Control&#xff0c;IoC&#xff09;的设计原则。IoC是一种编程思…

互联网加竞赛 基于深度学习的视频多目标跟踪实现

文章目录 1 前言2 先上成果3 多目标跟踪的两种方法3.1 方法13.2 方法2 4 Tracking By Detecting的跟踪过程4.1 存在的问题4.2 基于轨迹预测的跟踪方式 5 训练代码6 最后 1 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基于深度学习的视频多目标跟踪实现 …

ChatGPT论文指南|ChatGPT论文写作过程中6个润色与查重提示词

论文完成初稿之后&#xff0c;一般情况下&#xff0c;宝子们还需要找专家给我们提出评审意见。找专家评审其实并不容易&#xff0c;即使对老师来说&#xff0c;找人评审论文也是一件苦活。我们这个时候可以通过文字提示让 ChatGPT充当我们的评审专家&#xff0c;为论文提出问题…

【SpringBoot】FreeMarker视图渲染

目录 一、FreeMarker 简介 1.1 什么是FreeMarker&#xff1f; 1.2 Freemarker模板组成部分 1.3 为什么要使用FreeMarker 二、Springboot集成FreeMarker 2.1 配置 2.2 数据类型 2.2.1 字符串 2.2.2 数值 2.2.3 布尔值 2.2.4 日期 2.3 常见指令 2.3.2 assign 2.3…