2011-01-05 4 views
2

Я использую MVVM, а мой объект реализует IDataErrorInfo. Когда свойство задано, я запускаю специальные методы проверки, и если проверка прошла, я возвращаю String.empty, который устанавливает Validation.HasError в false. Если проверка не выполняется, значение Validation.HasError равно true. У меня есть стиль, который я использую для «необходимых элементов управления» (элементы управления, которые будут выполнять проверку) и Сет тултип управления к тому, что ошибка выглядит так:Validation.HasError не запускается снова, если новая ошибка возникает, когда уже верно

<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.

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

+0

У меня такая же проблема - вам удалось решить эту проблему? – pilsdumps

+0

Нет, никогда. Все еще подслушиваю меня. – Thelonias

ответ

3

Это, как представляется, ответ: IDataErrorInfo With Multiple Error Messages for a Property

В принципе, вы свяжете на текущий элемент и использовать ContentPresenter, чтобы отобразить сообщение об ошибке. Он работал для моего кода.

+0

Да, вы правы, предложение в моем ответе не работает - ответ удаляется сейчас. – Slauma

+0

Я все еще использую подсказку, но вместо этого я использую CurrentItem. Спасибо за информацию. – Thelonias

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

и вопрос был решен.

Заключение - Не используйте конвертер.

+0

Большое спасибо за публикацию этого решения. – alexandrudicu