如果对ValidationRule.Validate(object, CultureInfo, BindingExpressionBase) 进行重写,它会自动被调用吗?
我有一个自定义的WPF ValidationRule,我希望校验范围依赖于视图模型中的另一个值。
我过去使用这个两个参数的重载:
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
还有这个重载:
public override ValidationResult Validate(object value, CultureInfo cultureInfo, BindingExpressionBase owner)
我的问题是:如果我覆盖了三参数版本,WPF在常规绑定校验时会自动调用它吗,而不是两参数版本?关于重载选择,是否有官方保证,还是这取决于框架/场景?如果我不定义2 参数版本而只定义3 参数版本,我会得到这个编译错误:
Abstract inherited member 'ValidationResult System.Windows.Controls.ValidationRule.Validate(object, CultureInfo)' is not implemented
所以我在应用程序中同时定义了这两个版本,似乎确实调用了三参数覆盖,但我想要一个保证。
解决方案
我们总是可以到WPF源代码在GitHub上查看。
在那里我们可以看到如下代码片段,位于 wpf/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/BindingGroup.cs
ValidationResult validationResult = rule.Validate(DependencyProperty.UnsetValue, culture, this);
三参数的重载被调用。
我认为,最简单的形式下,三参数方法只是调用两参数方法。而你必须覆盖两参数方法,而三参数方法的重载是可选的。
在查看dotnet的源代码后,我们可以在 wpf/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/ValidationRule.cs 中看到确认
public virtual ValidationResult Validate(object value, CultureInfo cultureInfo, BindingExpressionBase owner)
{
switch (_validationStep)
{
case ValidationStep.UpdatedValue:
case ValidationStep.CommittedValue:
value = owner;
break;
}
return Validate(value, cultureInfo);
}
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。