Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 4.3 数据转换与验证

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)

验证机制

  1. 异常验证:

    • 在属性Setter中抛出异常
    • 自动触发Validation.HasError附加属性
    public int Age {
        get => _age;
        set {
            if(value < 0) 
                throw new ArgumentException("年龄不能为负");
            _age = value;
        }
    }
    
  2. IDataErrorInfo接口:

    • 实现Error属性和this[string]索引器
    • 支持多属性交叉验证
  3. 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>

性能优化建议

  1. 对静态数据使用x:Static代替转换器
  2. 缓存频繁使用的转换器实例
  3. 避免在转换器中执行耗时操作

最佳实践:对于企业级应用,建议结合FluentValidation等第三方库实现复杂验证逻辑,并通过Behavior封装可复用的验证规则组件。

Last Updated:: 5/3/25, 10:42 PM