首页 > 其他分享 >使用ValueConverters扩展实现枚举控制页面的显示

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

时间:2024-10-05 11:12:26浏览次数:6  
标签:targetType 实现 object ValueConverters 枚举 parameter 页面

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

标签:targetType,实现,object,ValueConverters,枚举,parameter,页面
From: https://www.cnblogs.com/sesametech-dotnet/p/18447676

相关文章

  • pbootcms模板如何输出当前页面的完整url地址
    在PBOOTCMS中,如果需要在模板文件中调用当前页面的完整URL,可以结合使用 {pboot:httpurl} 和 {content:link} 标签。这样可以生成当前页面的完整URL,包括协议头(如 http:// 或 https://)和具体路径。示例代码以下是一个示例代码,展示了如何在模板文件中调用当前页面的完整URL:......
  • PbootCMS网站后台登录页面样式怎么修改
    在PbootCMS中,如果你需要对后台的样式进行修改,通常需要找到相应的文件并进行编辑。下面是详细的步骤和注意事项:后台样式文件位置后台样式的文件通常位于以下路径:plaintext 根目录/apps/admin/view/default/index.html修改步骤备份文件:在修改任何文件之前,请务必先备......
  • framebuffer 设置页面大小 尺寸
      #include<stdio.h>#include<fcntl.h>#include<linux/fb.h>#include<sys/mman.h>#include<stdlib.h.> intmain(){intfb;structfb_var_screeninfovinfo; //打开framebuffer设备fb=open("/dev/fb0......
  • 前端无代码-表单页面的查看和编辑| uiotos致敬amis、appsmith、codewave、goview、dat
    上位机或管理系统,增删改查属于常规操作。其中以点击以查看和编辑,弹出表单页面,最为常见。 UIOTOS支持页面嵌套、属性继承(包括只读属性)。通过配置和连线,也能对表单页面区分查看和编辑,但有些繁琐。可以利用容器组件的表单只读属性,勾选后,连线传入表单数据,将只读显示。 文档地......
  • pbootcms模板自动生成当前页面二维码
    在PbootCMS中,可以使用 {pboot:qrcode} 标签来生成文本的二维码图片。这在产品列表页或详情页中非常有用,可以为每个产品生成二维码。使用方法html {pboot:qrcodestring=***}其中,string 参数用于指定生成二维码的内容。示例代码假设你需要为每个产品生成一个包含产......
  • 有效地在 PBootCMS 中调用站点信息,并确保页面显示正确
    基本站点信息标签:{pboot:siteindex}:站点入口地址,用于站内链接跳转设置地址前置。{pboot:sitepath}:站点路径,根目录时值为空。{pboot:sitelanguage}:站点语言。{pboot:sitetitle}:站点标题。{pboot:sitesubtitle}:站点副标题。{pboot:sitedomain}:站点域名。{pboot:sitelogo}:......
  • pbootcms后台公司信息的内容如何调用到前台页面上
    为了在PBootCMS中实现一个公司信息标签,使其可以在全站任意地方使用,并且能够从后台的基础内容中调取公司相关信息,可以按照以下步骤进行操作:步骤1:创建标签进入后台管理系统:登录PBootCMS后台管理系统。进入标签管理:导航到“标签管理”模块。创建新标签:点击“新......
  • 页面缓存详解
    在学习Swagger的时候刚开始使用Swagger3.x但是有些配置还是使用之前版本的,所以就一直报404,在查阅一些网上的资料后,(现在还不知道是版本配置问题)大多数都是让清除以下缓存,我知道怎么清除(平时的清除缓存一般指的是清除浏览器缓存),当然之前也零散的接触过一些关于缓存的知识,但是没......
  • JavaScript 网页设计案例 简单的电商案例 页面切换 数据搜索 动态网页
    JavaScript网页设计案例简单的电商案例页面切换数据搜索动态网页1.案例描述以下是一个简单的产品展示网页,用户可以通过点击不同的产品类别按钮来查看相应的产品,且在鼠标悬停时显示产品详情。页面还将包含一个搜索框,用户可以输入关键词来筛选产品。2.文件结构-......
  • 【CSS/HTML】footer固定在页面底部的实现方法总结
    方法一:footer高度固定+绝对定位HTML代码:<body><header>头部</header><main>中间内容</main><footer>底部信息</footer></body>CSS代码:*{margin:0;padding:0;}html{height:100%;}body{min-height:100%......