如果模型中的验证有错误,请禁用按钮

时间:2011-02-05 17:47:12

标签: wpf validation idataerrorinfo caliburn.micro

您好,我在模型类中对错误进行了验证。

 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

    }

我在视图模型中使用的这个模型类,我将模型类的Nick属性绑定到comboBox控件的Text属性。

此外,我在视图中的按钮单击事件上从视图模型类绑定方法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()
    {}
 }

解决方案很简单如果CurrentUser(object)属性中的验证有错误,则CanLogOn属性为false。

但我不知道如何通知属性CanLogOn在模型类中没有错误。我运行应用程序,按钮仍然被禁用。

我需要在模型中实现这种行为:

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

有什么建议吗?谢谢。

1 个答案:

答案 0 :(得分:0)

将事件处理程序附加到viewmodel中用户的PropertyChanged事件:

CurrentUser.PropertyChanged += new PropertyChangedEventHandler(CurrentUser_PropertyChanged);

如果ValidationResult发生更改,则添加发送通知:

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

注意:如果您的引用CurrentUser被覆盖,则需要将事件处理程序添加到新对象。您可以通过将附件代码放在CurrentUser

的设置器中来完成此操作