WPF中IValueConverter的基本用法
WPF绑定默认不支持类型自动转换,比如把
DateTime转成“2024-03-15”字符串、把
bool转成可见性
Visibility,必须靠
IValueConverter。它只有两个方法:
Convert(绑定源→目标)和
ConvertBack(目标→源),后者在单向绑定里可以返回
Binding.DoNothing或直接抛
NotSupportedException。
在XAML中声明并使用转换器的三步操作
转换器必须是公开类、有无参构造函数,且实例需作为资源引入XAML才能复用。常见错误是忘了加
x:Key,或在
Binding里写错资源名。 定义转换器类(继承
IValueConverter),确保
Convert处理
null和非预期类型,避免运行时崩溃 XAML中用
xmlns映射命名空间,再在
Resources里声明:
<local:BoolToVisibilityConverter x:Key="BoolToVis"/>在
Binding中通过
Converter={StaticResource BoolToVis}引用;若需传参,用ConverterParameter(值为
object,注意类型匹配)
ConvertBack什么时候必须实现?
仅当绑定模式为
TwoWay或
OneWayToSource,且用户交互会修改目标属性(如
TextBox.Text输入、
CheckBox.IsChecked切换)时,
ConvertBack才被调用。例如把日期字符串解析回
DateTime,必须手动处理格式错误——
DateTime.TryParse比
Parse更安全。 如果只读显示,用
Mode=OneWay,
ConvertBack可直接返回
Binding.DoNothing若
ConvertBack逻辑复杂或不可逆(如哈希值转原文),应抛
NotSupportedException并确保绑定模式不触发它
ConvertParameter不能直接传泛型或匿名对象,建议用
string或简单枚举,避免XAML解析失败
调试IValueConverter常见卡点
转换器不生效,90% 是资源未正确定义或路径不对;静默失败(如绑定显示空白)往往是
Convert返回
null而目标属性不允许(如
TextBlock.Text接受
null但显示为空,
Image.Source则直接异常)。 在
Convert开头加
Debugger.Break()或日志,确认是否被调用 检查绑定路径是否正确:比如
{Binding Path=IsActive, Converter={StaticResource BoolToVis}}中IsActive属性必须存在且可访问 WPF不会捕获转换器内的异常并吞掉,而是抛出
XamlParseException或
InvalidOperationException,堆栈里通常含
System.Windows.Data.BindingExpression避免在转换器里做耗时操作(如IO、网络请求),UI线程会卡顿;复杂逻辑建议提前计算好,或改用
IMultiValueConverter组合多个值 实际项目里最容易被忽略的是转换器的线程安全性——它可能被多个绑定并发调用,别在内部缓存状态或修改静态字段。
