我有一个文本框,该文本框绑定到需要一个值的属性,即:

 [Required(ErrorMessage = "required value")]
 public string SomeText
 {
     //get set...
 }


在XAML中,我为文本框设置了以下设置:

 UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=true, ValidatesOnExceptions=true


不出所料,当文本框中没有值时,将显示红色边框,但是当我选择其他选项卡然后返回到无效结果页面时,将不再显示红色边框。仅当我输入有效结果然后将其删除时,它才会重新出现。

我该如何调试?我如何找出导致红色边框出现的事件?

最佳答案

在WPF中,当从可视树中卸载选项卡上的项目时,会丢失标记为无效的事实。基本上,当发生验证错误时,UI会响应验证堆栈中的事件并将项目标记为无效。当项目重新回到可视化树中时,不会重新评估该标记,除非对绑定也进行了重新评估(如果用户单击选项卡项目,通常不会这样)。

在某处定义一个这样的函数(我将其与其他一些东西一起放在静态ValidationHelper类中):

public static void ReMarkInvalid( DependencyObject obj )
{
    if( Validation.GetHasError( obj ) ) {
        List<ValidationError> errors = new List<ValidationError>( Validation.GetErrors( obj ) );
        foreach( ValidationError error in errors ) {
            Validation.ClearInvalid((BindingExpressionBase)error.BindingInError);
            Validation.MarkInvalid((BindingExpressionBase)error.BindingInError, error);
        }
    }

    for( int i = 0; i < VisualTreeHelper.GetChildrenCount( obj ); i++ ) {
        ReMarkInvalid( VisualTreeHelper.GetChild( obj, i ) );
    }
}


我认为您可以在TabControl的Selected事件中调用此函数,它应该具有预期的效果。例如。:

private void TabControl_Selected(...)
{
    ReMarkInvalid( tabControl );
}


如果这不起作用,则可能需要以较低的Dispatcher优先级执行此操作,以确保视觉树已首先完成加载。看起来像用以下内容替换ReMarkInvalid ...:

Dispatcher.BeginInvoke( new Action( delegate()
{
    ReMarkInvalid( tabControl );
} ), DispatcherPriority.Render );

关于wpf - 在TextBox上验证:无效结果上并不总是出现红色边框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7601055/

10-09 22:55