Validation.HasError не срабатывает снова, если появляется новая ошибка, которая уже истинна.

StackOverflow https://stackoverflow.com/questions/4606509

Вопрос

Я использую 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 -> False -> True.

Есть ли у кого-нибудь опыт работы с этим или какой-нибудь совет, как нажать на спусковой крючок?

Это было полезно?

Решение

Это, кажется, ответ: IDATAERRORINFO с несколькими сообщениями об ошибках для недвижимости

По сути, вы связываете с текущим элементом и используете ContentPreesenter для отображения ошибки. Он работал на моем коде.

Другие советы

Я считаю, что понял это.Виновником является использование конвертера.У меня возникла та же проблема, и фрагмент кода проблемы был:

<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}"/>

и проблема была решена.

Вывод — не используйте конвертер.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top