Проверка данных в окне ShowDialog в WPF

У меня есть окно, которое я отображаю как ShowDialog в окне. У меня есть некоторые текстовые поля, привязанные к объекту, которые реализуют INotifyPropertyChanges и IDataErrorInfo. Я хочу, чтобы кнопка «ОК» была включена, только если все поля были проверены, и я хочу, чтобы пользователь нажал «ОК», но при следующем движении произойдет.

Я могу привязать кнопку к ICommand и проверить проверку текстовых полей в CanExcute(), но что я могу сделать в Excute? объект не знает об окне. Я также могу проверить проверку текстовых полей, а затем вызвать событие, которое все действительно, и включить кнопку «ОК», но тогда будет дублирующийся код, потому что я уже проверил в реализации IDataErrorInfo.

Итак, каков правильный путь?

заранее спасибо


person david    schedule 11.07.2011    source источник


Ответы (1)


Вы CanExecute должны выглядеть так.

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

Здесь свойства Error и Errors представляют собой не что иное, как Wrapper над this[string propertyName] (реализовано неявно для 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;
    }
person Pradeep    schedule 12.07.2011
comment
Спасибо за ответ! но как я могу включить кнопку и что я могу сделать в ExecuteOk? SampleModel не знает об окне. - person david; 12.07.2011
comment
CanExecuteOK сделает это за вас. вам не нужно беспокоиться об этом. Если CanExecuteOK возвращает false, ваша кнопка будет автоматически отключена, а если true, она будет включена. Напомним, что для привязки команд вам потребуется реализовать 2 метода. CanExecuteOK и ExecuteOK. CanExecute скажет, когда включить/отключить, а ExecuteOK скажет, что делать. - person Pradeep; 12.07.2011