private bool ValidateProperty <T>(string propertyName, T value)
        {
            var validationResults = new List <ValidationResult>();
            ValidationContext validationContext = new(this)
            {
                MemberName = propertyName
            };
            var success = Validator.TryValidateProperty(value, validationContext, validationResults);

            if (!success)
            {
                _validationErrors[propertyName] = validationResults.Select(c => c.ErrorMessage).ToList();
            }
            else
            {
                _ = _validationErrors.Remove(propertyName);
            }
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
            return(success);
        }
    }
        public bool ValidateData()
        {
            HasErrors = (CurrentItem != null && (string.IsNullOrEmpty(CurrentItem.FirstName) || string.IsNullOrEmpty(CurrentItem.LastName)));
            if (HasErrors)
            {
                if (string.IsNullOrEmpty(CurrentItem.FirstName))
                {
                    ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs("FirstName"));
                }

                if (string.IsNullOrEmpty(CurrentItem.LastName))
                {
                    ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs("LastName"));
                }
            }
            else
            {
                return(true);
            }
            return(false);
        }
 public void AddError(
     string propertyError,
     Type ruleErrorType,
     [CallerMemberName] string propertyName = "",
     bool addUnique = false)
 {
     if (propertyError == null)
     {
         return;
     }
     if (!_ErrorsTypes.ContainsKey(propertyName))
     {
         _ErrorsTypes.Add(propertyName, new Dictionary <string, Type> {
             { propertyError, ruleErrorType }
         });
     }
     else
     if (!_ErrorsTypes[propertyName].ContainsKey(propertyError))
     {
         _ErrorsTypes[propertyName].Add(propertyError, ruleErrorType);
     }
     if (!_Errors.ContainsKey(propertyName))
     {
         _Errors.Add(propertyName, new List <string> {
             propertyError
         });
     }
     else
     {
         if (!addUnique || !_Errors[propertyName].Contains(propertyError))
         {
             _Errors[propertyName].Add(propertyError);
         }
     }
     if (NotifyErrorsChangedEnabled)
     {
         ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
     }
     NotifyPropertyChanged(nameof(IsValid));
 }
Exemple #4
0
    protected internal bool AddError(string errorMessage, [CallerMemberName] string propertyName = null)
    {
        var ph = HasErrors;

        propertyName = propertyName ?? string.Empty;
        if (!Errors.TryGetValue(propertyName, out var l))
        {
            Errors[propertyName] = l = new HashSet <string>();
        }
        if (l.Add(errorMessage))
        {
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));

            if (!ph)
            {
                RaisePropertyChanged(nameof(HasErrors));
            }

            return(true);
        }
        return(false);
    }
        protected void Validate(Func <bool> rule, string error, [CallerMemberName] string propertyName = "")
        {
            if (string.IsNullOrWhiteSpace(propertyName))
            {
                return;
            }

            if (_errors.ContainsKey(propertyName))
            {
                _errors.Remove(propertyName);
            }

            if (rule() == false)
            {
                _errors.Add(propertyName, new List <string> {
                    error
                });
            }

            OnPropertyChanged(nameof(HasErrors));
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
Exemple #6
0
        private void Validate(string propertyName)
        {
            var value   = GetType().GetProperty(propertyName).GetValue(this);
            var context = new ValidationContext(this)
            {
                MemberName = propertyName
            };
            var errors = new List <ValidationResult>();

            validationErrors.Remove(propertyName);
            if (Validator.TryValidateProperty(value, context, errors) == false)
            {
                validationErrors.Add(
                    propertyName,
                    errors.Select(e => e.ErrorMessage).ToList().AsReadOnly()
                    );
            }
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));

            OnPropertyChanged(nameof(HasErrors), false);
            OnPropertyChanged(nameof(HasNoErrors), false);
        }
Exemple #7
0
        public bool Validate([CallerMemberName] string propertyName = null)
        {
            if (!validators.ContainsKey(propertyName))
            {
                return(true);
            }

            _explicitlyCalled = true;
            try
            {
                if (validators[propertyName].Any(attribute => !attribute.IsValid(this.propertyGetters[propertyName](this))))
                {
                    ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
                    return(false);
                }
                return(true);
            }
            finally
            {
                _explicitlyCalled = false;
            }
        }
        public void Validate <T>(string propertyName, T propertyValue, IValidator <T> validator)
        {
            var propertyErrors = GetErrors(propertyName) as List <string>;

            if (propertyErrors == null)
            {
                propertyErrors = new List <string>();
            }
            else
            {
                propertyErrors.Clear();
            }

            if (validator.Validate(propertyValue) == false)
            {
                propertyErrors.AddRange(validator.ValidationErrorMessages);
            }

            ErrorsDictionary[propertyName] = propertyErrors;

            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
        public void MergeErrors(IEnumerable <ValidationFailure> validationFailures)
        {
            var newInvalidProperties = validationFailures.Select(e => e.PropertyName).ToList();
            var oldInvalidProperties = _modelErrors.Keys.ToList();

            var validProperties = oldInvalidProperties.Except(newInvalidProperties);

            foreach (var validProperty in validProperties)
            {
                _modelErrors[validProperty].Clear();
                ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(validProperty));
            }

            foreach (var invalidProperty in newInvalidProperties)
            {
                var failures = validationFailures.Where(e => e.PropertyName.Equals(invalidProperty)).ToList();

                foreach (var failure in failures)
                {
                    var errorMessage = failure.ErrorMessage;

                    _modelErrors.AddOrUpdate(invalidProperty, new List <string>()
                    {
                        errorMessage
                    }, (key, messages) =>
                    {
                        if (!messages.Contains(errorMessage))
                        {
                            messages.Add(errorMessage);
                        }

                        return(messages);
                    });
                }

                ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(invalidProperty));
            }
        }
        private void SetError(string propertyName, Tuple <string, bool> incoming)
        {
            bool signal = false;

            if (incoming == null)
            {
                signal = this.errors.Remove(propertyName);
            }
            else
            {
                if (signal = !this.errors.TryGetValue(propertyName, out Tuple <string, bool> current) || !Equals(current, incoming))
                {
                    this.errors[propertyName] = incoming;
                }
            }

            if (signal)
            {
                OnPropertyChanged(nameof(HasErrors));
                ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
                ((RelayCommand)CreateResourceCommand).ChangeCanExecute();
            }
        }
Exemple #11
0
    protected internal bool RemoveError(string errorMessage, [CallerMemberName] string propertyName = null)
    {
        var ph = HasErrors;

        propertyName = propertyName ?? string.Empty;

        if (_Errors != null &&
            _Errors.TryGetValue(propertyName, out var l) &&
            l.Remove(errorMessage))
        {
            if (!l.Any())
            {
                _Errors.Remove(propertyName);
            }
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
            if (ph && !HasErrors)
            {
                RaisePropertyChanged(nameof(HasErrors));
            }
            return(true);
        }
        return(false);
    }
Exemple #12
0
        private void ValidateProperty <T>(T value, [CallerMemberName] string propertyName = null)
        {
            if (propertyName == null)
            {
                return;
            }

            var issues = new List <Validation>();

            var validationContext = new ValidationContext(this);

            validationContext.MemberName = propertyName;
            var validationResult = new Collection <ValidationResult>();

            if (!Validator.TryValidateProperty(value, validationContext, validationResult))
            {
                issues.AddRange(validationResult.Select(result => Validation.Error(result.ErrorMessage)));
            }

            if (_validationRules.TryGetValue(propertyName, out var validationRules))
            {
                issues.AddRange(validationRules
                                .Cast <Func <T, Validation> >()
                                .Select(validationRule => validationRule(value))
                                .Where(validationIssue => validationIssue != null));
            }

            _validationIssues.Remove(propertyName);
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));

            if (issues.Any())
            {
                _validationIssues[propertyName] = issues;
            }

            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
        public bool TryValidateModel()
        {
            ValidationContext context = new ValidationContext(this);

            validationResults.Clear();
            validationErrors.Clear();

            if (!Validator.TryValidateObject(this, context, validationResults, true))
            {
                foreach (ValidationResult validationResult in validationResults)
                {
                    string property = validationResult.MemberNames.ElementAt(0);
                    if (validationErrors.ContainsKey(property))
                    {
                        validationErrors[property].Add(validationResult.ErrorMessage);
                    }
                    else
                    {
                        validationErrors.Add(property, new List <string> {
                            validationResult.ErrorMessage
                        });
                    }
                }

                foreach (var property in GetValidatableProperties())
                {
                    ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(property));
                }
                return(false);
            }

            foreach (var property in GetValidatableProperties())
            {
                ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(property));
            }
            return(true);
        }
        public async void ValidateProperty <T>(string propertyName, T value)
        {
            var results = new List <ValidationResult>();
            ValidationContext context = new ValidationContext(this);

            context.MemberName = propertyName;
            Validator.TryValidateProperty(value, context, results);

            List <string> bussinessErrors = null;

            if (ValidationDelegate != null)
            {
                bussinessErrors = await ValidationDelegate(this, propertyName);
            }
            if (bussinessErrors != null)
            {
                if (_errors.ContainsKey(propertyName))
                {
                    _errors[propertyName].AddRange(bussinessErrors);
                }
                else
                {
                    _errors.Add(propertyName, bussinessErrors);
                }
            }

            if (results.Any())
            {
                _errors[propertyName] = results.Select(c => c.ErrorMessage).ToList();
            }
            else if (bussinessErrors == null || bussinessErrors != null && !bussinessErrors.Any())
            {
                _errors.Remove(propertyName);
            }
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
Exemple #15
0
        public StrobeEffectViewModel()
        {
            var canGenerate = this.WhenAnyValue(
                x => x.Color1,
                x => x.Color2,
                x => x.HasErrors,
                (c1, c2, err) => !err && c1 != c2 && ShowLightViewModel.GetShowlightType(c1) == ShowLightViewModel.GetShowlightType(c2));

            this.WhenAnyValue(x => x.StartTime, x => x.EndTime)
            .Subscribe(tuple =>
            {
                var(startTime, endTime) = tuple;
                bool errorsChanged      = false;

                if (_errors.ContainsKey(nameof(EndTime)))
                {
                    _errors.Remove(nameof(EndTime));
                    errorsChanged = true;
                }

                if (endTime <= startTime)
                {
                    _errors.Add(nameof(EndTime), "End time cannot be less than start time.");
                    errorsChanged = true;
                }

                if (errorsChanged)
                {
                    ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(nameof(EndTime)));
                    this.RaisePropertyChanged(nameof(HasErrors));
                }
            });

            Generate = ReactiveCommand.Create(GenerateStrobeEffect, canGenerate);
            Generate.BindTo(this, x => x.GeneratedShowlights);
        }
        public void ClearPropertyValidationErrors([CallerMemberName] string propertyName = "")
        {
            if (!_Errors.ContainsKey(propertyName))
            {
                return;
            }
            var lst = _Errors[propertyName].ToList();

            foreach (var e in lst)
            {
                if (_ErrorsTypes.TryGetValue(propertyName, out var propErrTypes) &&
                    propErrTypes.TryGetValue(e, out var errType) &&
                    errType.FullName == "System.Windows.Controls.NotifyDataErrorValidationRule")
                {
                    _Errors[propertyName]
                    .Remove(e);
                }
                if (NotifyErrorsChangedEnabled)
                {
                    ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
                }
                NotifyPropertyChanged(nameof(IsValid));
            }
        }
        public void Validate([CallerMemberName] string propertyName = "")
        {
            if (_validator == null)
            {
                throw new NullReferenceException("An instance of IValidator is required");
            }

            var result        = _validator.Validate(this);
            var errorMessages = result.Errors.Where(x => x.PropertyName == propertyName)
                                .Select(em => em.ErrorMessage).ToList();

            if (_errors.ContainsKey(propertyName))
            {
                _errors.Remove(propertyName);
            }
            if (errorMessages.Count > 0)
            {
                foreach (var message in errorMessages)
                {
                    if (_errors.ContainsKey(propertyName))
                    {
                        _errors[propertyName].Add(message);
                    }
                    else
                    {
                        _errors.Add(propertyName, new List <string> {
                            message
                        });
                    }
                }
            }



            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
Exemple #18
0
        /// <summary>
        /// Sets the errors for the given property.
        /// If <paramref name="errors"/> is null or empty, the errors of <paramref name="propertyName"/> are cleared.
        /// If an entry of <paramref name="errors"/> is null or empty, it is ignored.
        /// </summary>
        protected void SetErrors(string propertyName, IEnumerable <string> errors)
        {
            if (errors == null)
            {
                ClearErrors(propertyName);
                return;
            }
            var errorList = errors.Where(s => !string.IsNullOrEmpty(s)).ToList();

            if (!errorList.Any())
            {
                ClearErrors(propertyName);
                return;
            }
            IList <string> oldList;

            if (_errorDict.TryGetValue(propertyName, out oldList) && oldList.Count == errorList.Count &&
                oldList.SequenceEqual(errorList))
            {
                return;
            }
            _errorDict[propertyName] = errorList;
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
 /// <summary>
 /// Notifies listeners that the errors of a property have changed.
 /// </summary>
 /// <param name="propertyName">Name of the property used to notify listeners.</param>
 private void OnErrorsChanged(string propertyName)
 {
     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
 }
        protected virtual void ClearErrors(string propertyName)
        {
            errors.Remove(propertyName);

            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
Exemple #21
0
 protected virtual void OnErrorsChanged(string propertyName)
 {
     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
     base.OnPropertyChanged(nameof(HasErrors));
 }
Exemple #22
0
        /// <summary>
        /// Validates a property with a specified name and a given input value.
        /// </summary>
        /// <param name="value">The value to test for the specified property.</param>
        /// <param name="propertyName">The name of the property to validate.</param>
        /// <exception cref="ArgumentNullException">Thrown when <paramref name="propertyName"/> is <see langword="null"/>.</exception>
        private void ValidateProperty(object?value, string?propertyName)
        {
            if (propertyName is null)
            {
                ThrowArgumentNullExceptionForNullPropertyName();
            }

            // Check if the property had already been previously validated, and if so retrieve
            // the reusable list of validation errors from the errors dictionary. This list is
            // used to add new validation errors below, if any are produced by the validator.
            // If the property isn't present in the dictionary, add it now to avoid allocations.
            if (!this.errors.TryGetValue(propertyName !, out List <ValidationResult>?propertyErrors))
            {
                propertyErrors = new List <ValidationResult>();

                this.errors.Add(propertyName !, propertyErrors);
            }

            bool errorsChanged = false;

            // Clear the errors for the specified property, if any
            if (propertyErrors.Count > 0)
            {
                propertyErrors.Clear();

                errorsChanged = true;
            }

            // Validate the property, by adding new errors to the existing list
            bool isValid = Validator.TryValidateProperty(
                value,
                new ValidationContext(this, null, null)
            {
                MemberName = propertyName
            },
                propertyErrors);

            // Update the shared counter for the number of errors, and raise the
            // property changed event if necessary. We decrement the number of total
            // errors if the current property is valid but it wasn't so before this
            // validation, and we increment it if the validation failed after being
            // correct before. The property changed event is raised whenever the
            // number of total errors is either decremented to 0, or incremented to 1.
            if (isValid)
            {
                if (errorsChanged)
                {
                    this.totalErrors--;

                    if (this.totalErrors == 0)
                    {
                        OnPropertyChanged(HasErrorsChangedEventArgs);
                    }
                }
            }
            else if (!errorsChanged)
            {
                this.totalErrors++;

                if (this.totalErrors == 1)
                {
                    OnPropertyChanged(HasErrorsChangedEventArgs);
                }
            }

            // Only raise the event once if needed. This happens either when the target property
            // had existing errors and is now valid, or if the validation has failed and there are
            // new errors to broadcast, regardless of the previous validation state for the property.
            if (errorsChanged || !isValid)
            {
                ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
            }
        }
Exemple #23
0
 public void RaiseErrorsChanged(string sPropertyName)
 {
     _isRaiseErrorsChanged = false;
     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(sPropertyName));
 }
Exemple #24
0
        void Validate([CallerMemberName] string propertyName = null)
        {
            List <string> errors;

            if (!_errors.TryGetValue(propertyName, out errors))
            {
                errors = new List <string>();
                _errors[propertyName] = errors;
            }

            StringBuilder builder;

            switch (propertyName)
            {
            case nameof(LoginName):
                errors.Clear();
                if (LoginName?.Length > 0 && !Regex.IsMatch(LoginName, @"^[\x21-\x7E]+$"))
                {
                    errors.Add("Invalid symbols (space is not allowed)");
                }
                if (LoginName?.Length > 32)
                {
                    errors.Add("Max length is 32");
                }
                ErrorText = "";
                builder   = new StringBuilder();
                builder.Append(ErrorText);
                foreach (var str in errors)
                {
                    builder.Append(str + "\r\n");
                }
                ErrorText = builder.ToString().TrimEnd(new[] { '\r', '\n' });
                break;

            case nameof(LoginPassword):
                errors.Clear();
                if (LoginPassword?.ConvertToUnsecureString()?.Length > 0 && !Regex.IsMatch(LoginPassword?.ConvertToUnsecureString() ?? "", @"^[\x20-\x7E]+$"))
                {
                    errors.Add("Invalid symbols");
                }
                if (LoginPassword?.ConvertToUnsecureString()?.Length > 32)
                {
                    errors.Add("Max length is 32");
                }
                ErrorText = "";
                builder   = new StringBuilder();
                builder.Append(ErrorText);
                foreach (var str in errors)
                {
                    builder.Append(str + "\r\n");
                }
                ErrorText = builder.ToString().TrimEnd(new[] { '\r', '\n' });
                break;

            case nameof(NewGameText):
                errors.Clear();
                builder = new StringBuilder();
                if (NewGameText?.Length > 0 && !Regex.IsMatch(NewGameText, @"^[\x20-\x7E]+$"))
                {
                    errors.Add("Invalid symbols");
                }
                if (NewGameText?.Length > 32)
                {
                    errors.Add("Max length is 32");
                }
                builder           = new StringBuilder();
                GameTextErrorText = "";
                builder.Append(ErrorText);
                foreach (var str in errors)
                {
                    builder.Append(str + "\r\n");
                }
                GameTextErrorText = builder.ToString().TrimEnd(new[] { '\r', '\n' });
                break;
            }

            HasErrors = _errors.Any(o => o.Value?.Count > 0);
            ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
        }
Exemple #25
0
 public void RaiseErrorsChanged(string propertyName)
 {
     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
 }
 private void ValidatorOnErrorsChanged(object sender, DataErrorsChangedEventArgs args)
 {
     ErrorsChanged?.Invoke(sender, args);
 }
Exemple #27
0
 /// <summary>
 /// Raises this object's <see cref="ErrorsChanged"/> event.
 /// </summary>
 /// <inheritdoc cref="DataErrorsChangedEventArgs(string)"/>
 protected void RaiseErrorsChanged(string propertyName)
 {
     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
     RaisePropertyChanged(nameof(HasErrors));
 }
Exemple #28
0
 private void OnErrorsChanged(string propertyName)
 {
     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
     NotifyOfPropertyChange(nameof(HasErrors));
 }
Exemple #29
0
 private void OnValidations_ErrorsChanged(object?sender, DataErrorsChangedEventArgs e)
 {
     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(e.PropertyName));
 }
Exemple #30
0
 protected virtual void OnErrorsChanged(string propertyName)
 {
     ErrorsChanged?.Invoke(this, new DataErrorsChangedEventArgs(propertyName));
 }