prism-使用IValueConverter
IValueConverter的使用
IValueConverter 是 WPF 数据绑定系统中的核心接口之一,主要用于在数据源(ViewModel)和 UI 元素(View)之间进行值转换。
作用
- 数据类型转换:将绑定的源数据类型转换为目标属性所需的类型。
- 数据格式化:对数据进行格式化显示(如日期、货币格式)。
- 逻辑转换:根据业务逻辑转换数据显示方式。
- 空值处理:处理 null 或默认值的显示问题。
应用场景
- 布尔值到可视性转换 (BoolToVisibility):控制UI元素显示/隐藏。
- 空值/默认值处理:当数据为null时显示默认值。
- 数值格式化:例如针对金额做格式化处理
- 枚举值转换:显示枚举的描述文本。
- 多值转换 (IMultiValueConverter):多个条件同时满足时显示元素。
实战演示一:控制UI元素显示/隐藏
- 导入Nuget包:Prism.DryIoc
- 解析主窗口并添加依赖注入配置,打开App.xaml.cs文件,修改成如下内容:
注意:Container是 PrismApplicationBase 基类提供的,不是 DryIoc 命名空间下的 Container 类。
public partial class App : PrismApplication
{
protected override Window CreateShell()
{
return Container.Resolve<MainWindow>();
}
protected override void RegisterTypes(IContainerRegistry containerRegistry)
{
containerRegistry.Register<MainWindow>();
}
}
- 值转换器实现:创建Converters文件夹,并在其中创建类文件BoolToVisibilityConverter,编写如下代码。
在Convert方法中,判断StackPanel绑定的数据源value是否为true,若为true则返回显示属性,否则返回隐藏属性。
/// <summary>
/// 值转换器
/// </summary>
public class BoolToVisibilityConverter : IValueConverter
{
/// <summary>
/// 数据源→UI控件转换(将数据模型的布尔值 bool 转换为UI的 Visibility 属性)
/// </summary>
/// <param name="value">绑定的源数据</param>
/// <param name="targetType">目标属性类型(如Visibility)</param>
/// <param name="parameter">XAML中传递的额外参数</param>
/// <param name="culture">区域文化信息</param>
/// <returns></returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
/// <summary>
/// UI控件→数据源转换
/// </summary>
/// <param name="value">UI控件的当前值</param>
/// <param name="targetType">数据源属性类型</param>
/// <param name="parameter">XAML中传递的额外参数</param>
/// <param name="culture">区域文化信息</param>
/// <returns></returns>
/// <exception cref="NotImplementedException"></exception>
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
- View实现
<Window
x:Class="WpfDemo.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:WpfDemo"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:cr="clr-namespace:WpfDemo.Converters"
x:Name="buttonwindow"
Title="主窗体"
Width="800"
Height="450"
mc:Ignorable="d">
<!-- 指定数据绑定的默认源对象 -->
<Window.DataContext>
<local:MainViewModel />
</Window.DataContext>
<Window.Resources>
<cr:BoolToVisibilityConverter x:Key="BoolToVisibility"/>
</Window.Resources>
<Grid>
<StackPanel Orientation="Vertical" Margin="20">
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center">
<Button Content="显示" Command="{Binding ShowCommand}" Margin="5" MinWidth="100" MaxWidth="200"/>
<Button Content="隐藏" Command="{Binding HideCommand}" Margin="5" MinWidth="100" MaxWidth="200"/>
</StackPanel>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="20" Visibility="{Binding IsEditMode, Converter={StaticResource BoolToVisibility}}">
<TextBlock VerticalAlignment="Center" Text="Hello World" />
</StackPanel>
</StackPanel>
</Grid>
</Window>
- ViewModel实现
public class MainViewModel : BindableBase
{
private bool _isEditMode;
public bool IsEditMode
{
get { return _isEditMode; }
set { SetProperty(ref _isEditMode, value); }
}
public DelegateCommand ShowCommand { get; private set; }
public DelegateCommand HideCommand { get; private set; }
public MainViewModel()
{
ShowCommand = new DelegateCommand(ShowTextBlock);
HideCommand = new DelegateCommand(HideTextBlock);
}
private void ShowTextBlock()
{
IsEditMode = true;
}
private void HideTextBlock()
{
IsEditMode = false;
}
}
- 运行效果:TextBlock元素默认隐藏,点击“显示”按钮显示该元素,点击“隐藏”按钮隐藏该元素。


人生如逆旅
我亦是行人

浙公网安备 33010602011771号