ETJava Beta | Java    注册   登录
  • 搜索:
  • 使用ValueConverters扩展实现枚举控制页面的显示

    发表于      阅读(1)     博客类别:Crawler     转自:https://www.cnblogs.com/sesametech-dotnet/p/18447676
    如有侵权 请联系我们删除  (页面底部联系我们)  

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