使用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>              <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、最终效果

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

4、总结

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

发表评论

相关文章