Disable button if validation in model has error

1.4k views Asked by At

Hi I make validation on error in my model class.

 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

    }

This model class I use in view model and I bind Nick property of model class to the Text property of comboBox control.

Also I bind method LogOn from view model class on button click event in view. I would like disabale button if validation in model class has error:

View model:

[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()
    {}
 }

Solution is simple set CanLogOn property on false if validation in CurrentUser (object) property has error.

But I don’t how notify property CanLogOn that in model class is not error. I run app and button is still disabled.

I need achive this behavior in model:

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

Any advice? Thank.

1

There are 1 answers

0
brunnerh On BEST ANSWER

Attach an event handler to the PropertyChanged event of the user in your viewmodel:

CurrentUser.PropertyChanged += new PropertyChangedEventHandler(CurrentUser_PropertyChanged);

Add send a notification if the ValidationResult changes:

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

Note: If your reference CurrentUser is overwritten you need to add the event handler to the new object. You could do this by placing the attachment code in the setter of CurrentUser.