Wednesday, August 22, 2018

wpf validierung IDataErrorInfo, ValidatesOnDataErrors=True, NotifyOnValidationError=True

um eigene DataError Validierung durchzuführen, muß das Viewmodel IDataErrorInfo implementieren - das ist ein INdexer auf das Viewmodel, dem als string der Properyname der zu validierenden Eigenschaft übergeben wird, und ein string mit validierungsmessage zurückgibt. null bedeutet kein Fehler.
Im Xaml müssen im Databinding ValidatesOnDataErrors=True, NotifyOnValidationError=True gesetz sein

IDataErrorInfo implementierung:

ganz einfach (in viewmodelbaseclass z.b.)
        public virtual string this[string columnName] => null; // nothing to validate here
        public virtual string Error => EditorResources.DefaultErrorMessage;


oder dann ausimplementiert:

      public override string this[string columnName]
        {
            get
            {
                switch (columnName)
                {
                    case nameof(MinNumericValue):
                    case nameof(MaxNumericValue):
                        return _validateMinMax(_doNumericValidation, MinNumericValue, MaxNumericValue);

                    case nameof(MinDecimalValue):
                    case nameof(MaxDecimalValue):
                        return _validateMinMax(_doDecimalValidation, MinDecimalValue, MaxDecimalValue);

                    case nameof(MinDateTimeValue):
                    case nameof(MaxDateTimeValue):
                        return _validateMinMax(_doDateTimeValidation, MinDateTimeValue, MaxDateTimeValue);

                    default:
                        return null;
                }
            }
        }


die Propery Setter:

        public int? MaxNumericValue
        {
            get => _maxNumericValue;
            set
            {
                _maxNumericValue = value;
                _doNumericValidation = true;
                OnPropertyChanged();
                OnPropertyChanged(nameof(MinNumericValue));
                _doNumericValidation = false;
                IsModified = true;
             
            }
        }



        public int? MinNumericValue
        {
            get => _minNumericValue;
            set
            {
                _minNumericValue = value;
                _doNumericValidation = true;
                OnPropertyChanged();
                OnPropertyChanged(nameof(MaxNumericValue));
                _doNumericValidation = false;
                IsModified = true;
            }
        }

usw.

einfache Min Max Validierung:



        private string _validateMinMax <T>(bool doValidation, T? min, T? max) where T: struct, IComparable<T>
        {
            if (!doValidation || null == min || null == max) return null;


            if (0 >= min.Value.CompareTo(max.Value))
                return null;
            return EditorResources.MinMax_Validation;

        }

auch gut:
https://www.codeproject.com/Tips/858492/WPF-Validation-Using-IDataErrorInfo

No comments: