2011-02-05 6 views
1

Привет Я делаю проверку на ошибку в классе модели.Отключить кнопку, если проверка в модели имеет ошибку

public class CurrentUser:IDataErrorInfo, INotifyPropertyChanged 
    { 
//... 

     private string _validationResult; 
     private string _nick; 

     public string Nick 
     { 
      get { return _nick; } 
      set 
      { 
       _nick = value; 
       NotifyPropertyChanged("Nick"); 
      } 
     } 

     public string ValidationResult 
     { 
      get { return _validationResult; } 
      private set 
      { 
       _validationResult = value; 
       NotifyPropertyChanged("ValidationResult"); 
      } 
     } 

     #region Implementation of INotifyPropertyChanged 

     public event PropertyChangedEventHandler PropertyChanged; 

     private void NotifyPropertyChanged(String info) 
     { 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs(info)); 
      } 
     } 

     #endregion 

     #region Implementation of IDataErrorInfo 

     private string NickValid() 
     { 
      if (string.IsNullOrEmpty(Nick)) 
      { 
       return NickNull; 
      } 
      if (Regex.IsMatch(Nick, "[^a-zA-Z0-9-_.]")) 
      { 
       return NickInvalidCharacters; 
      } 
      return string.Empty; 
     } 

     public string Error 
     { 
      get { throw new NotImplementedException(); } 
     } 

     public string this[string propertyName] 
     { 

      get 
      { 
       ValidationResult = string.Empty; 

       switch (propertyName) 
       { 
        case "Nick": 
         ValidationResult = NickValid(); 
         break; 
        default: 
         break; 
       } 
       return ValidationResult; 

      } 
     } 

     #endregion 

    } 

Эта модель класса я использую в модели представления и я связываю Ник свойство класса модели к Text свойство управления ComboBox.

Также я привязываю метод LogOn от класса модели вида при просмотре события щелчка. Я хотел бы кнопку disabale, если проверка в классе модели имеет ошибку:

Вид модели:

[Export(typeof(ILogOnViewModel))] 
[PartCreationPolicy(CreationPolicy.NonShared)] 
public class LogOnViewModel : Screen, ILogOnViewModel, 
    IPartImportsSatisfiedNotification 
{ 

    public CurrentUser CurrentUser { get; set; } 

    public bool CanLogOn 
    { 
     get 
     { 
      return string.IsNullOrWhiteSpace(CurrentUser.ValidationResult); 
     } 
    } 

    //bind on button click event 
    public void LogOn() 
    {} 
} 

Решение простое множество CanLogOn свойство на ложь, если проверка в свойстве CurrentUser (объект) имеет ошибку.

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

Мне нужно achive это поведение в модели:

public string ValidationResult 
    { 
     get { return _validationResult; } 
     private set 
     { 
      _validationResult = value; 
      NotifyPropertyChanged("ValidationResult"); 
      //notify property CanLogOn in view model class 
     } 
    } 

Любые советы? Спасибо.

ответ

0

Присоединить обработчик события к PropertyChanged события пользователя в вашей ViewModel:

CurrentUser.PropertyChanged += new PropertyChangedEventHandler(CurrentUser_PropertyChanged); 

Добавить отправить уведомление, если ValidationResult изменения:

void CurrentUser_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "ValidationResult") NotifyPropertyChanged("CanLogOn"); 
} 

Примечание: Если ваша ссылка CurrentUser перезаписывается, вам нужно добавить обработчик события к новому объекту. Вы можете сделать это, поместив код вставки в установщик CurrentUser.