2014-10-26 3 views
0

У меня проблемы с проверками, и до сих пор это была настоящая борьба. Я изменил код и много читал об этом, и следил за этим руководством большую часть пути: http://developingfor.net/2009/10/13/using-custom-validation-rules-in-wpf/, но у меня проблемы. Валидация не стреляет, и я не могу найти причину! Я отправлю часть своего кода.ValidationRule не срабатывает

public class RequiredFields : 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:

 <Style 
x:Key="textBoxInError" 
TargetType="{x:Type TextBox}"> 
     <Style.Triggers> 
      <Trigger 
     Property="Validation.HasError" 
     Value="true"> 
       <Setter 
      Property="ToolTip" 
      Value="{Binding (Validation.Errors)[0].ErrorContent, RelativeSource={x:Static RelativeSource.Self}}" /> 
       <Setter 
      Property="Background" 
      Value="Red" /> 
       <Setter 
      Property="Foreground" 
      Value="White" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

TextBox XAML:

<TextBox x:Name="txtFirstName" Validation.ErrorTemplate="{StaticResource validationTemplate}" HorizontalAlignment="Left" Height="23" Margin="156,62,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="149"> 
     <TextBox.Text> 
      <Binding Path="FirstName" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay"> 
       <Binding.ValidationRules> 
        <validators:RequiredFields ErrorMessage="Name is Required" /> 
       </Binding.ValidationRules> 
      </Binding> 
     </TextBox.Text> 
    </TextBox> 

CodeBehind для XAML окна имеет следующее:

 RequiredFields ss = new RequiredFields(); 
     this.DataContext = ss; 

Но по какой-то причине я не буду см. стрельбу по событиям. Если я отмечу точку останова в ValidationResult, она ничего не сделает.

ответ

1

Ваш валидационный запрос RequiredFields также используется как DataContext, но свойство FirstName не объявлено. Таким образом, привязка фактически не удалась. Вы должны определить отдельный ViewModel, в случае, если вы все еще хотите использовать RequiredFields как DataContext, вы должны добавить свойство FirstName так:

public class RequiredFields : ValidationRule, INotifyPropertyChanged 
{ 
    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); 
    } 
    //Implements INotifyPropertyChanged 
    public event PropertyChangedEventHandler PropertyChanged; 
    protected void OnPropertyChanged(string prop){ 
     var handler = PropertyChanged; 
     if(handler != null) handler(this, new PropertyChangedEventArgs(prop)); 
    } 
    //add the property FirstName 
    string _firstName; 
    public string FirstName { 
     get { 
      return _firstName; 
     } 
     set { 
      if(_firstName != value) { 
      _firstName = value; 
      OnPropertyChanged("FirstName"); 
      } 
     } 
    } 
} 

Код выше просто быстро исправить и демонстративное решение, а чем фактическая практика. Вам следует создать некоторый базовый класс, реализующий INotifyPropertyChanged, и реализовать отдельно ViewModel вместо использования некоторых существующих ValidationRule.

+1

Спасибо за ответ, у меня были проблемы с Интернетом, но я проверю это. Спасибо, король :) –

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