los*_*110 7 validation wpf textbox
我有一个绑定到需要值的属性的文本框,即:
[Required(ErrorMessage = "required value")]
public string SomeText
{
//get set...
}
Run Code Online (Sandbox Code Playgroud)
在我的XAML中,我的文本框有以下设置:
UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=true, ValidatesOnExceptions=true
Run Code Online (Sandbox Code Playgroud)
正如预期的那样,当文本框中没有值时会出现红色边框,但是当我选择其他选项卡然后返回到包含无效结果的页面时,将不再显示红色边框.如果我输入有效结果然后将其删除,它才会重新出现.
我该怎么调试呢?如何找出导致红色边框出现的事件?
在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 ) );
}
}
Run Code Online (Sandbox Code Playgroud)
我想你可以在TabControl的Selected事件中调用这个函数,它应该具有所需的效果.例如:
private void TabControl_Selected(...)
{
ReMarkInvalid( tabControl );
}
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,您可能需要以较低的Dispatcher优先级执行此操作,以确保可视树首先完成加载.这看起来像替换ReMarkInvalid ...用:
Dispatcher.BeginInvoke( new Action( delegate()
{
ReMarkInvalid( tabControl );
} ), DispatcherPriority.Render );
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
4822 次 |
最近记录: |