使用值转换器的场景:你得到一个值,你需要根据你的需求转成另一个东西,可以是图片、对象等等都行
传入的是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}}"/>
标签:object,ValueConversion,IValueConverter,调用,ConvertBack,key,new,转换器 From: https://www.cnblogs.com/lordxinwei/p/17355644.html