wpf中IValueConverter的两种实现方式(key和静态实例)以及 ValueConversion 特性
使用值转换器的场景:你得到一个值,你需要根据你的需求转成另一个东西,可以是图片、对象等等都行
传入的是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 <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}}"/>
分类:
WPF
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义