我使用 MVVM,我的对象实现了 IDataErrorInfo。设置属性后,我运行自定义验证方法,如果验证通过,我返回 String.empty,它将 Validation.HasError 设置为 false。如果验证失败,则 Validation.HasError 设置为 true。我有一种用于“必需控件”(将执行验证的控件)的样式,并将控件的工具提示设置为如下错误:
<Style x:Key="RequiredControl" TargetType="{x:Type Control}" >
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip" Value="{Binding (Validation.Errors), Converter={StaticResource ErrorConverter}, RelativeSource={x:Static RelativeSource.Self}}"/>
</Trigger>
</Style.Triggers>
</Style>
和错误转换器:
public class ZynErrorContentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var errors = value as ReadOnlyObservableCollection<ValidationError>;
if (errors == null) return "";
return errors.Count > 0 ? errors[0].ErrorContent : "";
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
问题是这样的:用户输入了无效的内容......并且 Validation.HasError 设置为 true。工具提示会按预期更新。如果用户尝试更正错误,但输入的值会导致不同类型的失效,则工具提示应显示新的错误字符串,但这不会发生。该错误显示为与第一个错误相同的错误。我知道为什么会发生这种情况(我认为)......因为没有触发触发器,因为 Validation.HasError 永远不会从 True -> False -> True 改变。
有没有人对此有任何经验或关于如何强制触发的一些建议?