wpf中IValueConverter的两种实现方式(key和静态实例)以及 ValueConversion 特性

发布时间 2023-04-26 13:40:47作者: 邪恶心机炜

使用值转换器的场景:你得到一个值,你需要根据你的需求转成另一个东西,可以是图片、对象等等都行

传入的是object,传出的也是object,使用值转换器需要继承接口:IValueConverter

里面有两个方法Convert 和 ConvertBack

Convert很好理解:你把xaml中某个对象中的某个属性或其他值传递到ValueConverter进行转换,return转换后的那个值

ConvertBack:看别人的回答是这么说的:ConvertBack方法用于将数据的可视化表示转换为特定的DataType。例如:您使用Converter将布尔值true转换为字符串“TrueBoolean”。此文本将显示在文本框中。当你改变TextBox的值时,ConvertBack方法将在绑定再次触发时被调用(默认为OnFocusLost)。现在,ConvertBack方法将尝试将新值转换为您希望的数据类型。因此,您必须实现逻辑来将“false boolean”转换为false。

 

定义好了Converter如何使用呢

在xaml代码里,你必须引用你写的converter所在的路径,如果是根路径下就直接使用xaml自带的local即可,别的则需要找到路径下的converter

 

两种引用的方式:

1、通过key值调用

把converter当作资源绑定到本地路径下,给他一个key然后调用

 

 1 <Window x:Class="WpfTutorialSamples.DataBinding.ConverterSample"
 2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4 xmlns:local="clr-namespace:WpfTutorialSamples.DataBinding"
 5 Title="ConverterSample" Height="140" Width="250">
 6 <Window.Resources>
 7 <local:YesNoToBooleanConverter x:Key="YesNoToBooleanConverter" />  //引入项目根路径下的转换器类,并起别名 YesNoToBooleanConverter(第一个是类名,第二个是起的名字,可以任意)
 8 </Window.Resources>
 9 <StackPanel Margin="10">
10 <TextBox Name="txtValue" />
11 <WrapPanel Margin="0,10">
12 <TextBlock Text="Current value is: " />
13 <TextBlock Text="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}"></TextBlock> //将textbox中text的值交给转换器处理
14 </WrapPanel>
15 <CheckBox IsChecked="{Binding ElementName=txtValue, Path=Text, Converter={StaticResource YesNoToBooleanConverter}}" Content="Yes" />
16 </StackPanel>
17 </Window>

2、通过类中绑定静态实例进行调用,这是一种奇怪的调用方式,但WPF就是这么干的,请习惯他

在类中代码中创造静态实例

    [ValueConversion(typeof(string), typeof(BitmapImage))]  //指明转换方式 是从字符串 转为 bit图
    internal class HeaderToImageConverter : IValueConverter
    {
        public static HeaderToImageConverter Instance = new HeaderToImageConverter(); //创建了一个静态实例
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        { 
            return new BitmapImage(new Uri($"pack://application:,,,/{image}"));
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            throw new NotImplementedException();
        }
    }

在xaml中调用转换器(转换器类路径仍在根目录下)

 <Image Width="50" Height="50"  Source="{Binding
                                            RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type TreeViewItem}},
                                            Path=Tag,
                                            Converter={x:Static local:HeaderToImageConverter.Instance}}"/>