2013-10-13 3 views
0

Я применил проверки требуемой проверки поля в текстовом поле wpf, используя класс ValidationRule . Мой код:Проблема с валидацией в WPF

public class RequiredField : ValidationRule 
{ 
    private String _errorMessage = String.Empty; 
    public string ErrorMessage 
    { 
     get { return _errorMessage; } 
     set { _errorMessage = value; } 
    } 

    public override ValidationResult Validate(object value, CultureInfo cultureInfo) 
    { 
     var str = value as string; 

     if (String.IsNullOrEmpty(str)) 
     { 
      return new ValidationResult(false, this.ErrorMessage); 
     } 
     return new ValidationResult(true, null); 
    } 
} 

И код XAML ниже:

<TextBox Name="txtName" MaxLength="50"> 
    <TextBox.Text> 
     <Binding Path="Name" UpdateSourceTrigger="PropertyChanged"> 
      <Binding.ValidationRules> 
       <myValidtaion:RequiredField ErrorMessage="Please enter Name." /> 
      </Binding.ValidationRules> 
     </Binding> 
    </TextBox.Text> 
</TextBox> 

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

Как я могу избежать этой ситуации?

+0

Можете ли вы остановиться в 'Validate' и предоставить стек вызовов? –

+0

Вы имеете в виду очистить поле, а не базу данных, я думаю? потому что, если это то, что вы имеете в виду, оно будет рассматривать его как изменение и, следовательно, подтверждать его снова ... Kinda имеет смысл – Noctis

+0

@ Ноктриса, я понимаю, но хочу предотвратить это. Milie, стек вызовов не имея никакого большой информации REMTools.dll! REMTools.RequiredField.Validate (значение объекта, System.Globalization.CultureInfo CultureInfo) Линия 27 \t C# я упускаю что-нибудь здесь? –

ответ

0

Это, по-видимому, общая проблема «проверки», но на самом деле это ожидаемая функция проверки WPF ... это также происходит при использовании интерфейса IDataErrorInfo.

Оба эти метода проверки подтвердят свои указанные свойства всякий раз, когда их значения меняются, что именно мы хотим (большую часть времени).

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

Возможно, вы можете отложить очистку полей до тех пор, пока пользователь не нажмет кнопку New, и в этом случае ошибки будут отображаться только тогда?

UPDATE >>>

Если вы должны были использовать интерфейс IDataErrorInfo, то вы можете добавить bool IsValidating свойства к классам типов данных, которые можно использовать для переключения проверки включения и выключения. У меня мало времени, поэтому я нашел сообщение, которое реализует этот интерфейс, который я адаптировал, чтобы продемонстрировать свою точку зрения.

public class Person : IDataErrorInfo 
{ 
    private int age; 
    private bool isValidating = true; 

    public int Age 
    { 
     get { return age; } 
     set { age = value; } 
    } 

    public bool IsValidating 
    { 
     get { return isValidating; } 
     set { isValidating = value; } 
    }  

    public string Error 
    { 
     get 
     { 
      return this["Age"]; 
     } 
    } 

    public string this[string name] 
    { 
     get 
     { 
      string result = null; 
      if (IsValidating) 
      { 
       if (name == "Age") 
       { 
        if (this.age < 0 || this.age > 150) 
        { 
         result = "Age must not be less than 0 or greater than 150."; 
        } 
       } 
      } 
      return result; 
     } 
    } 
} 

адаптирован из кода в принятом ответе на Creating WPF Validation error manually пост

При включении этой IsValidating свойства false, изменения собственности не будут подтверждены:

person.IsValidating = false; 
+0

Хмммм ... Но это будет нехорошо откладывать очистку полей, пока пользователь не нажмет на новую кнопку. Я предполагаю, что это должно быть каким-то образом, чтобы зафиксировать это. –

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