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
相关产品推荐
相关产品推荐

