Проверка данных в свете MVVM - PullRequest
       2

Проверка данных в свете MVVM

5 голосов
/ 27 сентября 2011

Каков наилучший способ проверки данных.Является ли хорошей практикой проведение проверки в моделях представления или проверка должна проводиться в моделях?а также, каков наилучший способ реализовать числовое (десятичное) текстовое поле в WPF с MVVM.Я использую инструментарий MVVM Light.

Ответы [ 3 ]

6 голосов
/ 27 сентября 2011

Чтобы иметь возможность предоставлять значимые сообщения пользователю, лучше всего задать свойства вашей ViewModel, которые должны быть связаны с TextBox типа string, и реализовать IDataErrorInfo в вашей ViewModel.

Inмои проекты, я использую это так.Я создал интерфейс IValidateable (пожалуйста, прости имя ...), который реализует IDataErrorInfo.Мой ViewModel реализует этот интерфейс:

public interface IValidateable : IDataErrorInfo
{
    ObservableCollection<Tuple<string, ValidationError>> InvalidProperties
    { get; }
    bool IsValid { get; }
}

Все мои текстовые поля используют следующий стиль:

<Style TargetType="{x:Type TextBox}">
    <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>
    <Setter Property="Validation.ErrorTemplate">
      <Setter.Value>
        <ControlTemplate>
          <Grid>
            <Grid.ColumnDefinitions>
              <ColumnDefinition Width="90*" />
              <ColumnDefinition Width="20" />
            </Grid.ColumnDefinitions>
            <Border BorderBrush="Red"
                    BorderThickness="1"
                    CornerRadius="2.75"
                    Grid.Column="0">
              <AdornedElementPlaceholder Grid.Column="0" />
            </Border>
            <TextBlock Foreground="Red"
                       Grid.Column="1"
                       Margin="0"
                       FontSize="12"
                       VerticalAlignment="Center"
                       HorizontalAlignment="Left">
              *
            </TextBlock>
          </Grid>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>

Это покажет подсказку, если введенное значение не соответствует моим правилам.

Кроме того, я создал небольшой механизм проверки, который позволяет назначать правила свойствам модели представления и базовому классу, который автоматически проверяет значение свойства при установке нового значения.
Элементы интерфейсаIValidateable используются для отображения значимого сообщения об ошибке пользователю, когда он пытается сохранить недопустимый объект.

1 голос
/ 27 сентября 2011

Реализация IDataError Info для класса, которая будет реализовывать два свойства Error, и это [string columnName] вы можете реализовать второе свойство с вашими ошибками связывания, которые вы хотите

public class MainViewModel:ViewModelBase,IDataErrorInfo  
{

public string Error
   {
   }
 public string this[string columnName]

 {
  get
      {
         string msg=nulll;
         switch(columnName)
            {
              case "MyProperty": //that will be your binding property
               //choose your validation logic
               if(MyProperty==0||MyProperty==null)
                 msg="My Property is required";
                break;
             }
         return msg;
        }
}

Также установите ValidateOnError = true в полях

0 голосов
/ 28 сентября 2011

Если вы используете IDataErrorInfo для проверки Viewmodel - НЕ ЗАБЫВАЙТЕ следующее:

если у вашей viewmodel есть свойства, отличные от typeof string, и вход в вашем представлении не может быть преобразован в тип свойства - тогда ваш вводникогда не достигайте модели представления и, следовательно, проверки - и пользователь перед представлением просто думает: «Почему я не вижу ошибки проверки!»

...