You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF MVVM中FluentValidation验证自定义UserControl失效问题求助

WPF MVVM中FluentValidation在自定义UserControl失效的解决思路
  • 绑定验证上下文并转发错误
    WPF的验证依赖ValidationContext传递错误信息,自定义UserControl需要把内部TextBox的错误冒泡到外层。可以在UserControl的XAML里给内部TextBox绑定Validation.Error事件,后台代码转发错误:

    <TextBox x:Name="InnerTextBox" Validation.Error="InnerTextBox_Error"/>
    
    private void InnerTextBox_Error(object sender, ValidationErrorEventArgs e)
    {
        if (e.Action == ValidationErrorEventAction.Added)
        {
            Validation.AddError(this, e.Error);
        }
        else
        {
            Validation.RemoveError(this, e.Error);
        }
    }
    

    另外,不要在UserControl内部硬设DataContext,改用RelativeSource绑定内部TextBox的Text属性,确保上下文正确传递:

    <TextBox Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=Text}" />
    
  • 确认验证触发逻辑正常
    检查ViewModel是否正确实现INotifyDataErrorInfo接口,确保UserControl绑定的属性变更时,ViewModel的验证方法被触发。比如在UserControl的Text属性setter里手动调用ViewModel的验证方法,针对目标属性重新验证:

    public string Text
    {
        get => (string)GetValue(TextProperty);
        set
        {
            SetValue(TextProperty, value);
            if (DataContext is YourViewModel viewModel)
            {
                viewModel.Validate(nameof(YourViewModel.Name));
            }
        }
    }
    

    ViewModel里的验证方法示例:

    public void Validate(string propertyName)
    {
        var result = _validator.Validate(this, opt => opt.IncludeProperties(propertyName));
        // 更新错误集合并触发错误变更通知
        _errors.Remove(propertyName);
        foreach (var error in result.Errors)
        {
            _errors.TryAdd(error.PropertyName, error.ErrorMessage);
        }
        ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
    }
    
  • 给UserControl添加错误可视化样式
    原生TextBox有默认错误样式,但自定义UserControl需要自己定义Validation.ErrorTemplate才能显示红色边框等错误状态。在UserControl的资源里添加样式:

    <UserControl.Resources>
        <Style TargetType="local:YourCustomTextBox">
            <Setter Property="Validation.ErrorTemplate">
                <Setter.Value>
                    <ControlTemplate>
                        <Border BorderBrush="Red" BorderThickness="1">
                            <AdornedElementPlaceholder/>
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </UserControl.Resources>
    

内容的提问来源于stack exchange,提问作者Alexander

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 10:47:50