2016-01-05 5 views
0

Какова возможная причина, по которой валидация не работает?Проверка данных в MVVM не работает

public class DatabaseObj : ValidatableModel, IFormattable 
{ 
    [Required(ErrorMessage="Hostname is required")] 
    public string Hostname 
    { 
     get { return _hostname; } 
     set { SetProperty(ref _hostname, value); } 
    } 
} 

[Serializable] 
public abstract class ValidatableModel : Model, INotifyDataErrorInfo 
{ 
} 

[Serializable] 
public abstract class Model : INotifyPropertyChanged 
{ 
} 

В XAML

<TextBox Text="{Binding DatabaseObj.Hostname, UpdateSourceTrigger=PropertyChanged, ValidatesOnExceptions=true, NotifyOnValidationError=true}" 
      Grid.Column="1" Grid.Row="1" Margin="0,1,91,10" HorizontalAlignment="Stretch"/> 

Однако, когда я скомпилировать и запустить, я опорожнить текстовое поле и не появится сообщение об ошибке и цвет по-прежнему остаются такими же.

* Обновление для класса объектов

+0

Посмотрите на [этот вопрос] (http://stackoverflow.com/questions/13136814/how-to-catch-dataannotations-validation-in-mvvm), может быть, он может вам помочь –

+1

Проверьте этот вопрос http: //stackoverflow.com/questions/22361803/data-annotations-idataerrorinfo-and-mvvm –

+0

Вы внедрили IDataErrorInfo? – Muds

ответ

0

Implemenet IDataErrorInfo class.Here Я прикрепил ссылку надеюсь, что это поможет вам многое для реализации IDataErrorInfo, а также показать конкретный/нужное сообщение.

Link

0

Там нет поддержки нет по умолчанию для DataAnnotations в WPF. Существует два способа реализации проверки в WPF.

  1. Использовать проверку на основе исключения. В привязки данных выражение, которое вы можете включает проверки на исключения, как в коде ниже:

    <TextBox Name=«age» Grid.Row=«1» Grid.Column=«1» Width=«200» Margin=«5» Text="{Binding Path=Age, ValidatesOnExceptions=true, NotifyOnValidationError=true, UpdateSourceTrigger=PropertyChanged}" /> 
    

    Тогда в вашей модели вы можете использовать логику типа данных по умолчанию, и он будет проверять входные значения (ДЗ пример, это будет запретить установку нечисловых значений для типа Int32). Или вы можете добавить свою собственную логику, используя исключения в собственность сеттер:

    public int Age 
    { 
        get { return age; } 
        set 
        { 
         if(value < 0) 
          throw new ArgumentException("Age can't be less then zero"); 
         if(value > 30) 
          throw new ArgumentException("Huh, no, too old for me"); 
         age = value; 
         OnNotifyPropertyChanged(); 
        } 
    } 
    
  2. Реализовать IDataErrorInfo в своем классе. Существует руководство по MSDN.

    public string Error 
    { 
        get 
        { 
         return null; 
        } 
    } 
    
    public string this[string name] 
    { 
        get 
        { 
         string result = null; 
    
         if (name == "Age") 
         { 
          if (this.age < 0) 
          { 
           result = "Age can't be less then zero"; 
          } 
          if(this.age > 30) 
          { 
           result = "Huh, no, too old for me"; 
          }     
         } 
         return result; 
        } 
    } 
    

Есть много статей (1, 2) в Интернете, чтобы включить проверку с DataAnnotations, то вы можете добавить пакеты из этой статьи и изменять свой код, чтобы реализовать свой сценарий.

Смежные вопросы