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>
<RadioButton
Margin="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>
<RadioButton
Margin="10,0,0,0"
Content="View D"
IsChecked="{Binding Page, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static enums:Page.PageD}}">
</RadioButton>
</StackPanel>
</Border>
<Border
Grid.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中还有很多有意思的实现,大家可以通过阅读源码查看具体的功能,同时也可以提升自己的编码水平。

使用ValueConverters扩展实现枚举控制页面的显示的更多相关文章

  1. asp.net mvc后台操作之读写xml控制首页动态页面开关显示

    一.背景 在asp.net mvc项目里,用户需要开拓几个活动版面,并以侧栏的方式呈现在首页右侧,几个活动时间不一致,为避免浏览者在活动未开放之时进入未开放的服务页面.因此不仅需要在活动代码中加入限制 ...

  2. js控制页面显示和表单提交

    早期的web页面在显示方面一般在后台进行控制,虽然对后台开发来讲是比较容易做到的,但是涉及到一个问题,那就是数据库压力. 因为要控制显示,所以会比较频繁的从数据库中来回调用. 现在的js功能越来越强, ...

  3. Flex中使用CSS控制页面样式

    Using file: Stylebounding.mxml Stylebounding2.mxml myCSS0329.css 在Flex4中使用CSS控制样式,既可以直接在MXML文件中写样式,也 ...

  4. js控制页面的全屏展示和退出全屏显示

    <!DOCTYPE html> <html> <meta http-equiv="Content-Type" content="text/h ...

  5. 《Two Days DIV + CSS》读书笔记——CSS控制页面方式

    1.1 你必须知道的知识 (其中包括1.1.1 DIV + CSS的叫法解释:1.1.2 DIV + CSS 名字的误区:以及1.1.3 W3C简介.由于只是背景知识,跳过该章.) 1.2 你必须掌握 ...

  6. [asp.net mvc 奇淫巧技] 03 - 枚举特性扩展解决枚举命名问题和支持HtmlHelper

    一.需求 我们在开发中经常会遇到一些枚举,而且这些枚举类型可能会在表单中的下拉中,或者单选按钮中会用到等. 这样用是没问题的,但是用过的人都知道一个问题,就是枚举的命名问题,当然有很多人枚举直接中文命 ...

  7. h5之scrollIntoView控制页面元素滚动

    如果滚动页面也是DOM没有解决的一个问题.为了解决这个问题,浏览器实现了一下方法,以方便开发人员如何更好的控制页面的滚动.在各种专有方法中,HTML5选择了scrollIntoView()作为标准方法 ...

  8. Effective Java 第三版——38. 使用接口模拟可扩展的枚举

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

  9. JS/jquery实现鼠标控制页面元素显隐

    最近网站要上一个活动广告横幅,当用户鼠标划过时显隐二维码.像这种鼠标事件控制页面元素显隐的情况,码农们会经常遇到,可以通过javascript或jquery代码实现,下面就几种常见需求一起归纳一下. ...

  10. asp.net core根据用户权限控制页面元素的显示

    asp.net core根据用户权限控制页面元素的显示 Intro 在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源,显示不同的内容,之前做了一个 AccessControlHelp ...

随机推荐

  1. redis数据结构:RedisObject,SkipList,SortedSet

    1.RedisObject对象 redis中任何KV都会被封装为RedisObject对象,也叫做Redis对象 2.SkipList 跳表 元素按照升序排列存储,是有序的双向链表 节点可以有多个指针 ...

  2. c语言模拟Python的命名参数

    最近在书里看到的,让c语言去模拟其他语言里有的命名函数参数.觉得比较有意思所以记录一下. 目标 众所周知c语言里是没有命名函数参数这种东西的,形式参数虽然有自己的名字,但传递的时候并不能通过这个名字来 ...

  3. 【Java】线程池配置

    先看JUC包自带的一个资源 线程池执行器: 初始化参数如下 ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor( corePo ...

  4. 【英伟达】GTC 2024|黄仁勋2小时演讲精华版|六大亮点| Blackwell GPU | DGX B200 | NVL72 | cuLitho | GROOT | Omniverse Cloud —— 智能机器人元年

    视频地址: https://www.youtube.com/watch?v=zBIddyiMXsU

  5. 灵巧手 —— 智能仿生手 —— 人形机器人(humanoid)

    产品主页: https://www.brainco.cn/#/product/brain-robotics 国内销售的一款产品,美国华人生产的,灵巧度非常高的一款仿生手产品.

  6. pygame游戏:python版本的贪吃蛇游戏 —— Python 贪吃蛇魔改大赛

    在网上找python版本的贪吃蛇游戏,看到一个Gitee Community / Python 贪吃蛇魔改大赛,感觉还不错,这里收藏下. 一等奖 1名 Snake Quest 蛇蛇闯关: jeffya ...

  7. 【转载】 windows python3 安装 openai gym 的 atari_py

    版权声明:本文为CSDN博主「dai1056318647」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net/dai ...

  8. nvme硬盘的断电保护是否有用,是噱头、智商税还是真的有需要?购买DOCKCASE智能M2固态硬盘盒10秒保护

    最近在某东上买了一个10秒断电保护的nvme硬盘,其实对于这个断电保护有用没有用我是不懂的,也是不care的,买这个硬盘盒主要就是为了这个屏幕去的,不过东西到手后我就开始思考这个断电保护到底有用没有用 ...

  9. 6. 从0开始学ARM-异常及中断处理、异常向量表、swi

    一.异常(Exception) 异常是理解CPU运转最重要的一个知识点,几乎每种处理器都支持特定异常处理,中断是异常中的一种. 有时候我们衡量一个操作系统的时候实时性就是看os最短响应中断时间以及单位 ...

  10. MySQL数据库基本操作包括MySQL过程、MySQL声明

    MySQL数据库 操纵数据库 查看数据库 show databases; 创建数据库 create database <database_name>; 删除数据库 drop databas ...