Ориентация wpf на версию 4.0 из 3.5 влияет на реализацию IDataErrorInfo - PullRequest
0 голосов
/ 22 марта 2011

У меня есть приложение MVVM, реализующее IDataErrorInfo с использованием версии 3.5. Я хочу попробовать и нацелиться на 4.0, поэтому изменил настройку Target Framework и изменил ее немного (BitmapFrames и т. П.). Большинство вещей кажутся просто хорошими, и процесс был относительно безболезненным, пока я не заметил, что было затронуто внедрение IDataErrorInfo.

Мой контрольный шаблон для проверки выглядит так:

    <ControlTemplate x:Key="temp__">
    <Border BorderBrush="Orange" BorderThickness="2" CornerRadius="4" SnapsToDevicePixels="True">    
        <DockPanel>         
        <Image HorizontalAlignment="Left" VerticalAlignment="Center" 
                         Width="16" Height="16" Margin="-20,0,0,0" 
                         Source="{StaticResource ErrorIcon}" 
                         ToolTip="{Binding ElementName=adornedElement, 
                                             Path=AdornedElement.(Validation.Errors), 
                                             Converter={helper:ValidationErrorsToStringConverter}}"/>
        <AdornedElementPlaceholder Name="adornedElement"/>
    </DockPanel>
    </Border>
</ControlTemplate>

и используется в стиле текстового поля, например:

<Setter Property="Validation.ErrorTemplate" Value="{DynamicResource error_holder}">

В моей ViewModel GetValidationError (string propertyName) использует переключатель для проверки правильности соответствующего свойства на основе моих правил.

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

Кто-нибудь знает о каких-либо изменениях в реализации IDataErrorInfo в 4.0, которые могут объяснить это? Есть идеи как это исправить?

Ответы [ 2 ]

0 голосов
/ 23 марта 2011

Хорошо, я исправил это.Вместо того, чтобы использовать реализацию по умолчанию, которая использует Validation.Errors [0], которая дает ошибки привязки, когда ошибка исправлена, я бы использовал конвертер.Не уверен, почему это привело к описанному поведению, но это так.Поэтому я изначально вернулся к использованию Validation.Errors [0], и сообщение об ошибке обновилось правильно.Однако это приведет к возвращению ошибок привязки.Вместо этого я реализовал совет здесь предотвращение ошибок привязки и проблема решена.

Мой ControlTemplate теперь выглядит так:

  <ControlTemplate x:Key="temp__">
<DockPanel LastChildFill="True">
  <Border BorderBrush="Orange" BorderThickness="2" CornerRadius="4" SnapsToDevicePixels="True">
    <Border.Effect>
      <DropShadowEffect ShadowDepth="0" Color="Orange" BlurRadius="10" />
    </Border.Effect>
    <DockPanel>          
      <Image HorizontalAlignment="Left" VerticalAlignment="Center"
                         Width="16" Height="16" Margin="-20,0,0,0" 
                         Source="{DynamicResource ErrorIcon}"               
             ToolTip="{Binding ElementName=adornedElement, 
                               Path=AdornedElement.(Validation.Errors)/ErrorContent}"/>
      <AdornedElementPlaceholder Name="adornedElement"/>
    </DockPanel>        
  </Border>
</DockPanel>

Однакогде ранее обязательное поле было помечено как ошибка при загрузке, это больше не происходит.Проверка появляется только после того, как произошла другая ошибка из-за ввода пользователя.Как я могу это исправить?

0 голосов
/ 22 марта 2011

Я не вижу вашу привязку, но вы должны добавить ValidatesOnDataErrors.

...