如果新错误已经出现,则Validation.HasError不会再次触发

时间:2011-01-05 16:29:33

标签: wpf tooltip validation idataerrorinfo validationerror

我使用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>

和ErrorConverter:

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更改而触发器触发器 - >假 - &gt;真。

有没有人对此有任何经验或有关如何强制触发的建议?

3 个答案:

答案 0 :(得分:3)

这似乎就是答案:IDataErrorInfo With Multiple Error Messages for a Property

基本上,您绑定到当前项并使用ContentPresenter来显示错误。它适用于我的代码。

答案 1 :(得分:2)

我相信我已经弄明白了。罪魁祸首是使用转换器。 我遇到了同样的问题,问题代码段是:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
                        Path=(Validation.Errors), 
                        Converter={StaticResource validationErrorsToStringConverter }}"/>

我将代码段更改为:

<Setter Property="ToolTip"
        Value="{Binding RelativeSource={x:Static RelativeSource.Self},
        Path=(Validation.Errors)[0].ErrorContent}"/>

问题已解决。

结论 - 请勿使用转换器。

答案 2 :(得分:0)

我有一个类似的问题,解决该问题的方法是按照Allan的回答删除转换器。

但是我没有使用current record pointer来获取当前项目,而是使用诸如ErrorContent这样的索引来获取Path=(Validation.Errors)[0].ErrorContent

这是代码中的样子:

<Setter Property="ToolTip" 
        Value="{Binding RelativeSource={x:Static RelativeSource.Self}, 
                Path=(Validation.Errors)/ErrorContent}" />

更多信息可以在这里找到:https://docs.microsoft.com/en-us/dotnet/api/system.windows.data.relativesource.self?view=netframework-4.8