Шаблон MVVM, IDataErrorInfo и Связывающий для отображения ошибку?

На (главным образом) старых процессорах, умножающихся на 31, может быть относительно дешевым. На ARM, например, это - только одна инструкция:

RSB       r1, r0, r0, ASL #5    ; r1 := - r0 + (r0<<5)

Большинство других процессоров потребовало бы отдельного сдвига и вычло бы инструкцию. Однако, если Ваш множитель является медленным, это - все еще победа. Современные процессоры имеют тенденцию иметь быстрые множители, таким образом, это не имеет большого значения, пока 32 идет на корректную сторону.

Это не большой хеш-алгоритм, но это достаточно хорошо и лучше, чем 1,0 кода (и намного лучше, чем 1,0 спецификации!).

6
задан Dave Clemmer 5 August 2011 в 19:01
поделиться

3 ответа

Я смотрел тот же образец всего несколько минут назад. Ваша догадка верна. В этом примере кода они удалили шаблон ErrorTemplate по умолчанию из элемента управления TextBox, чтобы он не отображал красный прямоугольник. Вместо использования ErrorTemplate они создают ContentProvider с содержимым, привязанным к ошибке проверки конкретного текстового поля.

6
ответ дан 8 December 2019 в 05:22
поделиться

При привязке к объекту, который поддерживает IDataErrorInfo, необходимо учитывать несколько функций класса привязки WPF:

  1. ValidatesOnDataErrors должен иметь значение True. Это указывает WPF искать и использовать интерфейс IDataError для базового объекта.

  2. Присоединенное свойство Validation.HasError будет установлено в значение true для целевого объекта, если интерфейс IDataError исходного объекта сообщил о проблеме проверки. Затем вы можете использовать это свойство с триггером, чтобы изменить всплывающую подсказку элемента управления для отображения сообщения об ошибке проверки (я делаю это в моем текущем проекте, и конечному пользователю это нравится).

  3. Присоединенное свойство Validation.Errors будет содержать перечисление любых ошибок ValidationResult, возникших в результате последней попытки проверки. Если вы используете подход всплывающей подсказки, используйте IValueConverter, чтобы получить только первый элемент ... в противном случае вы столкнетесь с ошибками привязки для отображения самого сообщения об ошибке.

  4. Класс привязки предоставляет NotifyOnValidationError, который, когда имеет значение True, заставит перенаправленные события всплывать из привязанного элемента управления каждые время изменения состояния правила проверки. Это полезно, если вы хотите реализовать обработчик событий в контейнере связанных элементов управления, а затем добавлять и удалять сообщения проверки в / из списка.

В MSDN есть образцы для выполнения обоих стилей обратной связи (всплывающие подсказки а также список), но я вставлю ниже код, который я назначил для реализации обратной связи с всплывающей подсказкой для моих DataGridCells и TextBox ...

Стиль DataGridCell:

   <Style TargetType="{x:Type dg:DataGridCell}"
           x:Key="DataGridCellStyle">

      <Setter Property="ToolTip"
              Value="{Binding Path=Column.(ToolTipService.ToolTip),RelativeSource={RelativeSource Self}}" />

      <Style.Triggers>
        <Trigger Property="Validation.HasError"
                 Value="True">
          <Setter Property="ToolTip"
                  Value="{Binding RelativeSource={RelativeSource Self},Path=(Validation.Errors), Converter={StaticResource ErrorContentConverter}}" />
        </Trigger>
      </Style.Triggers>

    </Style>

Стиль TextBox:

     <Style x:Key="ValidatableTextBoxStyle" TargetType="TextBox">
  <!--When the control is not in error, set the tooltip to match the AutomationProperties.HelpText attached property-->
  <Setter Property="ToolTip"
          Value="{Binding RelativeSource={RelativeSource Mode=Self},Path=(AutomationProperties.HelpText)}" />

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

ErrorContentConverter ( для получения первого сообщения об ошибке проверки для всплывающей подсказки):

Imports System.Collections.ObjectModel

Namespace Converters

    <ValueConversion(GetType(ReadOnlyObservableCollection(Of ValidationError)), GetType(String))> _
    Public Class ErrorContentConverter
        Implements IValueConverter

        Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
            Dim errors As ReadOnlyObservableCollection(Of ValidationError) = TryCast(value, ReadOnlyObservableCollection(Of ValidationError))
            If errors IsNot Nothing Then
                If errors.Count > 0 Then
                    Return errors(0).ErrorContent
                End If
            End If
            Return String.Empty
        End Function

        Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
            Throw New NotImplementedException()
        End Function

    End Class

End Namespace

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

    <TextBox Text="{Binding Path=EstimatedUnits,ValidatesOnDataErrors=True,NotifyOnValidationError=True}"
             Style="{StaticResource ValidatableTextBoxStyle}"
             AutomationProperties.HelpText="The number of units which are likely to sell in 1 year." />
16
ответ дан 8 December 2019 в 05:22
поделиться

Насколько я понимаю, Validation.ErrorTemplate = "{x: Null}" удаляет красный прямоугольник при наличии ошибки. Это может быть настроено так, чтобы не было красного прямоугольника вокруг текстового поля при запуске формы.

Для отображения ошибки в форме я видел где-то в коде: Content = "{Binding ElementName = lastNameTxt , Path = (Validation.Errors) .CurrentItem} ", поэтому я все еще предполагаю, что он привязан к текстовому полю (а не к модели данных) и проверяет, есть ли в нем ошибка с помощью статической проверки. Ошибки, которые могут подключаться к IDataErroInfo из модели данных?

Правильно ли я догадываюсь?

0
ответ дан 8 December 2019 в 05:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: