1、ValueConverters
本库包含了IValueConverter
接口的的最常用的实现,ValueConverters
用于从视图到视图模型的值得转换,某些情况下,可用进行反向转换。里面有一些抽象类、模板类的定义,可以继承这些类实现一些自己想要实现的功能,方便快速。像BoolToValueConverterBase
、ValueToBoolConverterBase
,以及继承这些类的模板类,我们都可以进行自定义功能。最重要的还有一个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
中还有很多有意思的实现,大家可以通过阅读源码查看具体的功能,同时也可以提升自己的编码水平。