WPF中ShowDialog窗口的数据验证

时间:2011-07-11 17:54:14

标签: wpf validation idataerrorinfo showdialog

我有一个显示为ShowDialog的窗口 在窗口中我有一些文本框绑定到实现INotifyPropertyChannges和IDataErrorInfo的对象。 我希望只有在验证了所有的文本框时才会启用“确定”按钮 我想要的只是当用户点击OK但是下一步将会发生。

我可以将按钮绑定到ICommand并检查CanExcute()中的文本框valitation但是我可以在Excute中做什么?对象不了解窗口。 我也可以检查textboxes valitation,然后引发所有有效的事件并启用OK按钮,但之后会有dupliacte代码,因为我已经在IDataErrorInfo implmention中检查了。

那么正确的方法是什么?

提前致谢

1 个答案:

答案 0 :(得分:0)

你的CanExecute应该是这样的。

   public bool CanExecuteOK        
   {
        get
        {
              if (DataModelToValidate.Error == null && DataModelToValidate.Errors.Count == 0) return true;
              else return false;
        }
   }

这里的错误和错误属性只不过是这个[string propertyName]的Wrapper(对IDataErrorInfo隐式实现)。

以下是样本模型类:

    public class SampleModel: IDataErrorInfo, INotifyPropertyChanged
    {
        public SampleModel()
        {
            this.Errors = new System.Collections.ObjectModel.ObservableCollection<string>();
        }
        private string _SomeProperty = string.Empty;
        public string SomeProperty
        {
            get
            {
                return _SomeProperty;

            }
            set
            {
                if (value != _SomeProperty)
                {
                    _SomeProperty= value;
                    RaisePropertyChanged("SomeProperty");
                }
            }
        }
....
....
        //this keeps track of all errors in current data model object
        public System.Collections.ObjectModel.ObservableCollection<string> Errors { get; private set; }
        //Implicit for IDataErrorInfo
        public string Error
        {
            get
            {
                return this[string.Empty];
            }
        }

        public string this[string propertyName]
        {
            get
            {

                string result = string.Empty;
                propertyName = propertyName ?? string.Empty;

                if (propertyName == string.Empty || propertyName == "SomeProperty")
                {
                    if (string.IsNullOrEmpty(this.SomeProperty))
                    {
                        result = "SomeProperty cannot be blank";
                        if (!this.Errors.Contains(result)) this.Errors.Add(result);
                    }
                    else
                    {
                        if (this.Errors.Contains("SomeProperty cannot be blank")) this.Errors.Remove("SomeProperty cannot be blank");
                    }
                }
......
      return result;
    }