使用ValueConverters扩展实现枚举控制页面的显示

1、ValueConverters

本库包含了IValueConverter接口的的最常用的实现,ValueConverters用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能,方便快速。像BoolToValueConverterBaseValueToBoolConverterBase,以及继承这些类的模板类,我们都可以进行自定义功能。最重要的还有一个ValueConverterGroup的实现,可以将几个Converter放在一起进行逐个转换,最终得到从初始值到最终值的转换。

2、使用ValueConverterGroup进行转换

本次我们就借助ValueConverterGroup的实现从Enum值到Visibility的转换,从而实现通过RadioButton控制界面内容的显示功能

2.1 新建项目

本次项目名称为:ValueConvertersApp,使用Prism框架+CommunityToolkit实现。本项目引用的库包括:

<PackageReference Include="CommunityToolkit.Mvvm" Version="8.3.2" />
<PackageReference Include="Prism.DryIoc" Version="9.0.537" />
<PackageReference Include="ValueConverters" Version="3.1.22" />
2.2 EnumToBooleanConverter的实现

EnumToBooleanConverter继承IValueConverter接口,主要内容为两个方法的实现,具体实现内容如下:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{var type = value.GetType();var parameterType = parameter.GetType();return type.Name == parameterType.Name&& type.FullName == parameterType.FullName&& value.Equals(parameter);
}public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{if (targetType == parameter.GetType()){return Enum.Parse(targetType, parameter.ToString());}if (parameter is string str){return Enum.Parse(targetType, str);}return DependencyProperty.UnsetValue;
}

其实,库中也有实现Enum值到Visibility的转换,但是在xaml中要使用字符串才可以,上面这个实现可以通过枚举类的引用就可以。以免枚举字符串文字写错。

2.3 界面实现

定义了一个枚举类型,用来控制MainWindow界面的内容显示,枚举类内容:

public enum Page
{PageA,PageB,PageC,PageD,
}

界面中内容的实现:

 <Grid><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition /></Grid.RowDefinitions><Border Margin="3"><StackPanel VerticalAlignment="Center" Orientation="Horizontal"><RadioButton Content="View A" IsChecked="{Binding Page, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static enums:Page.PageA}}"></RadioButton><RadioButtonMargin="10,0"d:IsChecked="true"Content="View B"IsChecked="{Binding Page, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static enums:Page.PageB}}"></RadioButton><RadioButton Content="View C" IsChecked="{Binding Page, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static enums:Page.PageC}}"></RadioButton><RadioButtonMargin="10,0,0,0"Content="View D"IsChecked="{Binding Page, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static enums:Page.PageD}}"></RadioButton></StackPanel></Border><BorderGrid.Row="1"Margin="3"BorderBrush="OrangeRed"BorderThickness="2"><Grid><Grid Visibility="{Binding Page, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static enums:Page.PageA}}"><TextBlock Text="View A"></TextBlock></Grid><Grid Visibility="{Binding Page, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static enums:Page.PageB}}"><TextBlock Text="View B"></TextBlock></Grid><Grid Visibility="{Binding Page, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static enums:Page.PageC}}"><TextBlock Text="View C"></TextBlock></Grid><Grid Visibility="{Binding Page, Converter={StaticResource EnumToVisibilityConverter}, ConverterParameter={x:Static enums:Page.PageD}}"><TextBlock Text="View D"></TextBlock></Grid></Grid></Border></Grid>

转换类的定义,在app.xaml中:

xmlns:converters="clr-namespace:ValueConvertersApp.Converters"
xmlns:convertervalue="clr-namespace:ValueConverters;assembly=ValueConverters"<converters:EnumToBooleanConverter x:Key="EnumToBooleanConverter" /><convertervalue:ValueConverterGroup x:Key="EnumToVisibilityConverter"><converters:EnumToBooleanConverter /><convertervalue:BoolToVisibilityConverter /></convertervalue:ValueConverterGroup>

3、最终效果

4、总结

ValueConverters中还有很多有意思的实现,大家可以通过阅读源码查看具体的功能,同时也可以提升自己的编码水平。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Shiro】3.Springboot实现缓存

最近已经快速入门了Shiro。对于登录、授权、认证等方法,每次都是从数据库直接查询。如果登录的人员过多,对数据库来说,是一项压力。如何减轻数据库的压力。EhCache 实现缓存 集成 Redis 实现 Shiro 缓存(推荐使用)在此之前,我们已经简单学会EhCache 和Reids的使用。 EhCa…

织梦如何数据库备份,织梦cms网站数据怎么备份与还原

织梦CMS(DedeCMS)的数据库备份和还原是非常重要的操作,可以帮助你在出现问题时快速恢复数据。下面详细介绍如何进行织梦CMS的数据库备份和还原。 一、数据库备份 1. 使用 phpMyAdmin 备份数据库登录 phpMyAdmin登录到你的网站控制面板(如 cPanel)。 找到并打开 phpMyAdmin…

【软考】3 校验码

校验码 码距概念:任意进制的两个码值之间的最小二进制位数称为校验码的码距 例如:二进制1bit位,从0到1,则码距是1,二进制2bit位 从 00 到 11 一共4个码字,但码距还是为1 可以设置 性别男为 00 女为 11两个合法码字,则该两个合法码字的最小码距为2 (间隔 01 和 10 两个)…

IOU指标

IOU:全称 intersection over union 交并比,两个区域真实框和预测框之间的交集比他们之间的总面积-交集的 IOU指标:通常用于评估计算机视觉任务中的模型性能,特别是目标检测和图像分割。一个较高的IoU值意味着模型的定位和分割精度更好。

Redis安装管理, RDB, AOF ubuntu使用

1.1 Redis 基础redis单线程处理用户请求,不用加锁。其他线程做别的工作1.2 Redis 安装 Ubuntu 安装 Redis 范例:基于官方仓库包安装 (可以安装最新版本)#官方地址 https://redis.io/docs/install/install-redis/install-redis-on-linux/#导入key [root@ubuntu2204 ~]#curl -f…

查找和管理数据库的具体步骤

登录MySQL命令行使用SSH连接到服务器。 登录MySQL命令行:bashmysql -u root -p输入MySQL root用户的密码。查看数据库列表在MySQL命令行中查看所有数据库:sqlSHOW DATABASES;选择织梦CMS数据库选择织梦CMS使用的数据库:sqlUSE dedecmsv56gbk;查看数据库表查看织梦CMS数据库中…

DedeCMS Error Track:DedeCMS错误警告:连接数据库失败

当织梦CMS(DedeCMS)出现“连接数据库失败”的错误时,可以通过以下几个步骤进行排查和解决: 1. 检查数据库配置文件打开配置文件打开织梦CMS的数据库配置文件 include/config.inc.php。 使用FTP工具或SSH连接到服务器,然后打开该文件。检查配置信息确认数据库配置信息是否正…

SpringMVC内容

SpringMVC简介 SpringMVC(Model View Controller) 是以Servlet API为基础的 Web 框架并可以部署到 Servlet容器(比如:Tomcat),是控制层框架,主要负责与前端交互,接收前端的参数,在服务层进行交互,并把结果返回会前端页面。 SpringMVC工作原理当发送请求的时候,Dis…

Linux系统安装Pycharm专业版【附破解方法】

​写在前面 本教程适用于 Pycharm 2022.2.3 以下所有版本 一、版本信息 虚拟机产品:VMware Workstation 17 Pro 虚拟机版本:17.0.0 build-20800274 ISO映像文件:ubuntukylin-22.04-pro-amd64.iso Pycharm版本:PyCharm 2022.3.3 (Professional Edition) 资源链接:https:/…

谷歌收录批量查询,谷歌收录批量查询的方法步骤

谷歌收录批量查询是网站管理员和SEO专家常用的一种方法,用于同时查询多个页面或网站在谷歌搜索引擎中的收录情况。以下是几种常见的谷歌收录批量查询方法及其步骤: 一、使用Google Search Console(谷歌搜索控制台) 虽然Google Search Console主要面向单个网站的监控和管理,…

怎么查看网站是否被谷歌收录,查看网站是否被谷歌收录的快速检测方法

查看网站是否被谷歌收录,有多种快速检测方法可供选择。以下是一些常用的方法: 一、使用“site:”指令 打开谷歌搜索引擎:在浏览器中打开Google.com,确保使用的是谷歌的官方搜索引擎。 输入查询指令:在搜索框中输入“site:”加上你的网站域名(注意使用英文状态下的冒号,并…

10 月 4 日 S 组 风 雨 大 作

智障行为+2T1 T2 T3 T40 0 0 0好吧至少下一次不会考更低了 T1 你有个 n 个点 m 条边的无向图,每条边都有红蓝两种颜色中的一种,保证红色的边形成了这个图的一个生成树。 你希望给这些边赋上边权,保证边权是 1 ∼ m 的排列,使得红色的边是最小生成树。 希望这些边权形成的序…