4.3 数据转换与验证
数据转换(Value Conversion)
基本概念
- 作用:解决数据源与目标控件之间数据类型/格式不匹配的问题(如:布尔值转Visibility、日期格式化)
- 核心接口:
IValueConverter(需实现Convert和ConvertBack方法) - 典型场景:
- 数值转进度条百分比
- 枚举值转本地化描述
- 空值显示默认占位图
实现示例
public class BoolToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return (bool)value ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return (Visibility)value == Visibility.Visible;
}
}
XAML中使用
<Window.Resources>
<local:BoolToVisibilityConverter x:Key="BoolToVisibility"/>
</Window.Resources>
<Button Visibility="{Binding IsAvailable, Converter={StaticResource BoolToVisibility}}"/>
数据验证(Validation)
验证机制
异常验证:
- 在属性Setter中抛出异常
- 自动触发
Validation.HasError附加属性
public int Age { get => _age; set { if(value < 0) throw new ArgumentException("年龄不能为负"); _age = value; } }IDataErrorInfo接口:
- 实现
Error属性和this[string]索引器 - 支持多属性交叉验证
- 实现
INotifyDataErrorInfo(.NET 4.5+):
- 异步验证支持
- 错误信息分组管理
验证反馈UI
<TextBox Style="{StaticResource ErrorValidationStyle}">
<TextBox.Text>
<Binding Path="Age" NotifyOnValidationError="True">
<Binding.ValidationRules>
<ExceptionValidationRule/>
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
自定义验证规则
继承ValidationRule类:
public class EmailValidationRule : ValidationRule {
public override ValidationResult Validate(object value, CultureInfo culture) {
return Regex.IsMatch(value?.ToString(), @"^[\w-]+@[\w-]+\.\w+$")
? ValidationResult.ValidResult
: new ValidationResult(false, "邮箱格式无效");
}
}
高级技巧
复合转换器(MultiBinding)
- 多个数据源组合转换
- 需使用
IMultiValueConverter
验证模板定制
通过重写ControlTemplate自定义错误提示样式:
<ControlTemplate x:Key="ValidationErrorTemplate">
<StackPanel>
<AdornedElementPlaceholder/>
<TextBlock Foreground="Red" Text="{Binding [0].ErrorContent}"/>
</StackPanel>
</ControlTemplate>
性能优化建议
- 对静态数据使用
x:Static代替转换器 - 缓存频繁使用的转换器实例
- 避免在转换器中执行耗时操作
最佳实践:对于企业级应用,建议结合FluentValidation等第三方库实现复杂验证逻辑,并通过Behavior封装可复用的验证规则组件。
