ValueConverters.NET,WPF转换器应用

ValueConverters.NET 是一个功能丰富的转换器库,让我详细介绍它的主要功能和使用方法。

1. 安装包

Install-Package ValueConverters.NET

2. 常用转换器和示例

BoolToValueConverter (布尔值转换器)

<Window.Resources>
    <!-- 布尔值转可见性 -->
    <conv:BoolToValueConverter x:Key="boolToVisibility"
                              TrueValue="Visible"
                              FalseValue="Collapsed"/>
    
    <!-- 布尔值转颜色 -->
    <conv:BoolToValueConverter x:Key="boolToColor"
                              TrueValue="Green"
                              FalseValue="Red"/>
</Window.Resources>

<StackPanel>
    <TextBlock Text="状态指示器"
              Visibility="{Binding IsActive, 
                          Converter={StaticResource boolToVisibility}}"/>
    
    <Border Background="{Binding IsValid,
            Converter={StaticResource boolToColor}}"/>
</StackPanel>

EnumToValueConverter (枚举转换器)

<Window.Resources>
    <conv:EnumToValueConverter x:Key="enumToColor" DefaultValue="Gray">
        <conv:EnumToValueConverter.Mappings>
            <conv:EnumMapping EnumValue="Active" Value="Green"/>
            <conv:EnumMapping EnumValue="Inactive" Value="Red"/>
            <conv:EnumMapping EnumValue="Pending" Value="Yellow"/>
        </conv:EnumToValueConverter.Mappings>
    </conv:EnumToValueConverter>
</Window.Resources>

<ListBox ItemsSource="{Binding Items}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <Border Background="{Binding Status, 
                    Converter={StaticResource enumToColor}}">
                <TextBlock Text="{Binding Name}"/>
            </Border>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

DateTimeConverter (日期时间转换器)

<Window.Resources>
    <conv:DateTimeConverter x:Key="dateConverter"
                           Format="yyyy-MM-dd"/>
    
    <conv:DateTimeConverter x:Key="timeConverter"
                           Format="HH:mm:ss"/>
</Window.Resources>

<StackPanel>
    <TextBlock Text="{Binding CreatedDate, 
              Converter={StaticResource dateConverter}}"/>
    
    <TextBlock Text="{Binding UpdateTime,
              Converter={StaticResource timeConverter}}"/>
</StackPanel>

MathConverter (数学运算转换器)

<Window.Resources>
    <conv:MathConverter x:Key="mathConverter"/>
</Window.Resources>

<StackPanel>
    <!-- 加法运算 -->
    <TextBlock Text="{Binding Value, 
              Converter={StaticResource mathConverter},
              ConverterParameter=x+10}"/>
    
    <!-- 乘法运算 -->
    <TextBlock Text="{Binding Width,
              Converter={StaticResource mathConverter},
              ConverterParameter=x*0.5}"/>
</StackPanel>

MultiValueConverter (多值转换器)

<Window.Resources>
    <conv:MultiValueConverter x:Key="loginValidator"
                             ConverterType="And"/>
</Window.Resources>

<Button Content="登录" IsEnabled="{Binding}">
    <Button.DataContext>
        <MultiBinding Converter="{StaticResource loginValidator}">
            <Binding Path="HasUsername"/>
            <Binding Path="HasPassword"/>
            <Binding Path="IsNotBusy"/>
        </MultiBinding>
    </Button.DataContext>
</Button>

StringToValueConverter (字符串转换器)

<Window.Resources>
    <conv:StringToValueConverter x:Key="stringToDouble"
                                TargetType="Double"
                                FallbackValue="0"/>
</Window.Resources>

<TextBox Text="{Binding Amount,
         Converter={StaticResource stringToDouble}}"/>

3. 高级用法

组合转换器

<Window.Resources>
    <!-- 组合多个转换器 -->
    <conv:ValueConverterGroup x:Key="complexConverter">
        <conv:BoolToValueConverter TrueValue="1" FalseValue="0"/>
        <conv:MathConverter ConverterParameter="x*100"/>
        <conv:StringToValueConverter TargetType="String" 
                                   Format="{0}%"/>
    </conv:ValueConverterGroup>
</Window.Resources>

<TextBlock Text="{Binding IsComplete,
          Converter={StaticResource complexConverter}}"/>

带参数的转换器

<conv:EnumToValueConverter x:Key="enumToBrush">
    <conv:EnumToValueConverter.Mappings>
        <conv:EnumMapping EnumValue="Normal">
            <conv:EnumMapping.Value>
                <LinearGradientBrush>
                    <GradientStop Color="LightGreen" Offset="0"/>
                    <GradientStop Color="Green" Offset="1"/>
                </LinearGradientBrush>
            </conv:EnumMapping.Value>
        </conv:EnumMapping>
        <!-- 其他映射... -->
    </conv:EnumToValueConverter.Mappings>
</conv:EnumToValueConverter>

4. 实用技巧

  1. 使用 FallbackValue 和 TargetNullValue:
<TextBlock Text="{Binding Score,
          Converter={StaticResource numberConverter},
          FallbackValue='N/A',
          TargetNullValue='--'}"/>
  1. 调试转换:
<conv:DebugConverter x:Key="debugConverter"/>
<!-- 在转换过程中输出调试信息 -->
  1. 条件格式化:
<Style TargetType="TextBlock">
    <Style.Triggers>
        <DataTrigger Value="True">
            <DataTrigger.Binding>
                <Binding Path="Value"
                         Converter="{StaticResource thresholdConverter}"
                         ConverterParameter="100"/>
            </DataTrigger.Binding>
            <Setter Property="Foreground" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

这个包的优点是:

  1. 转换器种类丰富
  2. 使用方便灵活
  3. 支持链式转换
  4. 提供良好的错误处理
  5. 性能优化
  6. 文档完善

建议根据实际需求选择合适的转换器,并善用组合转换器来处理复杂的转换逻辑。

posted @ 2026-08-04 22:30  blade13  阅读(0)  评论(0)    收藏  举报