prism-使用IValueConverter

IValueConverter的使用

IValueConverter 是 WPF 数据绑定系统中的核心接口之一,主要用于在数据源(ViewModel)和 UI 元素(View)之间进行值转换。

作用

  1. 数据类型转换:将绑定的源数据类型转换为目标属性所需的类型。
  2. 数据格式化:对数据进行格式化显示(如日期、货币格式)。
  3. 逻辑转换:根据业务逻辑转换数据显示方式。
  4. 空值处理:处理 null 或默认值的显示问题。

应用场景

  1. 布尔值到可视性转换 (BoolToVisibility):控制UI元素显示/隐藏。
  2. 空值/默认值处理:当数据为null时显示默认值。
  3. 数值格式化:例如针对金额做格式化处理
  4. 枚举值转换:显示枚举的描述文本。
  5. 多值转换 (IMultiValueConverter):多个条件同时满足时显示元素。

实战演示一:控制UI元素显示/隐藏

  1. 导入Nuget包:Prism.DryIoc
  2. 解析主窗口并添加依赖注入配置,打开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>();
    }
}
  1. 值转换器实现:创建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();
    }
}
  1. 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>

  1. 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;
    }
}
  1. 运行效果:TextBlock元素默认隐藏,点击“显示”按钮显示该元素,点击“隐藏”按钮隐藏该元素。

posted @ 2025-04-26 14:19  相遇就是有缘  阅读(19)  评论(0)    收藏  举报