/// <summary> /// Creates a new object that is a copy of the current instance. /// </summary> /// <returns> /// A new object that is a copy of this instance. /// </returns> public object Clone() { var validationData = new ValidationData(ParentEnumerable); validationData.FieldWarnings = new ObservableCollection<FieldWarningOrErrorInfo>(); validationData.FieldWarnings.AddRange(FieldWarnings); validationData.BusinessWarnings = new ObservableCollection<BusinessWarningOrErrorInfo>(); validationData.BusinessWarnings.AddRange(BusinessWarnings); validationData.FieldErrors = new ObservableCollection<FieldWarningOrErrorInfo>(); validationData.FieldErrors.AddRange(FieldErrors); validationData.BusinessErrors = new ObservableCollection<BusinessWarningOrErrorInfo>(); validationData.BusinessErrors.AddRange(BusinessErrors); return validationData; }
/// <summary> /// Raises the events for differences. /// </summary> /// <param name="value">The value.</param> /// <param name="oldValidationData">The old validation data.</param> /// <param name="newValidationData">The new validation data.</param> private void RaiseEventsForDifferences(object value, ValidationData oldValidationData, ValidationData newValidationData) { // Warnings - fields RaiseEventsForDifferencesInFields(value, oldValidationData.FieldWarnings, newValidationData.FieldWarnings, ValidationType.Warning); // Warnings - business RaiseEventsForDifferencesInBusiness(value, oldValidationData.BusinessWarnings, newValidationData.BusinessWarnings, ValidationType.Warning); // Errors - fields RaiseEventsForDifferencesInFields(value, oldValidationData.FieldErrors, newValidationData.FieldErrors, ValidationType.Error); // Errors - business RaiseEventsForDifferencesInBusiness(value, oldValidationData.BusinessErrors, newValidationData.BusinessErrors, ValidationType.Error); }
/// <summary> /// Raises the events for differences. /// </summary> /// <param name="value">The value.</param> /// <param name="oldValidationData">The old validation data.</param> /// <param name="newValidationData">The new validation data.</param> private void RaiseEventsForDifferences(object value, ValidationData oldValidationData, ValidationData newValidationData) { // Warnings - fields RaiseEventsForDifferencesInFields(value, oldValidationData?.FieldWarnings ?? (IEnumerable <FieldWarningOrErrorInfo>)ArrayShim.Empty <FieldWarningOrErrorInfo>(), newValidationData.FieldWarnings, ValidationType.Warning); // Warnings - business RaiseEventsForDifferencesInBusiness(value, oldValidationData?.BusinessWarnings ?? (IEnumerable <BusinessWarningOrErrorInfo>)ArrayShim.Empty <BusinessWarningOrErrorInfo>(), newValidationData.BusinessWarnings, ValidationType.Warning); // Errors - fields RaiseEventsForDifferencesInFields(value, oldValidationData?.FieldErrors ?? (IEnumerable <FieldWarningOrErrorInfo>)ArrayShim.Empty <FieldWarningOrErrorInfo>(), newValidationData.FieldErrors, ValidationType.Error); // Errors - business RaiseEventsForDifferencesInBusiness(value, oldValidationData?.BusinessErrors ?? (IEnumerable <BusinessWarningOrErrorInfo>)ArrayShim.Empty <BusinessWarningOrErrorInfo>(), newValidationData.BusinessErrors, ValidationType.Error); }
/// <summary> /// Checks a entity that either implements the <see cref="IDataWarningInfo"/> or <see cref="IDataErrorInfo"/> on warnings and errors. /// </summary> /// <param name="value">The object to check.</param> /// <param name="propertyChanged">The propery that has been changed. <c>null</c> if no specific property has changed.</param> /// <param name="parentEnumerable">The parent enumerable. <c>Null</c> if the object does not belong to an enumerable.</param> /// <remarks> /// Internally calls the generic method with the same name. /// </remarks> private void CheckObjectValidation(object value, string propertyChanged, IEnumerable parentEnumerable) { ValidationData currentValidationData; ValidationData oldValidationData; if (value == null) { return; } lock (_objectValidationLock) { if (!_objectValidation.ContainsKey(value)) { _objectValidation[value] = new ValidationData(parentEnumerable); } currentValidationData = _objectValidation[value]; oldValidationData = (ValidationData)currentValidationData.Clone(); } var model = value as IModel; CheckObjectValidationForFields(value, propertyChanged, currentValidationData.FieldWarnings, ValidationType.Warning); #region Warnings - business currentValidationData.BusinessWarnings.Clear(); if (model != null) { if (!model.IsHidingValidationResults) { foreach (var warning in model.ValidationContext.GetBusinessRuleWarnings()) { currentValidationData.BusinessWarnings.Add(new BusinessWarningOrErrorInfo(warning.Message)); } } } else { string businessWarning = GetWarningOrError(value, ValidationType.Warning); if (!string.IsNullOrEmpty(businessWarning)) { currentValidationData.BusinessWarnings.Add(new BusinessWarningOrErrorInfo(businessWarning)); } } #endregion CheckObjectValidationForFields(value, propertyChanged, currentValidationData.FieldErrors, ValidationType.Error); #region Errors - business currentValidationData.BusinessErrors.Clear(); if (model != null) { if (!model.IsHidingValidationResults) { foreach (var error in model.ValidationContext.GetBusinessRuleErrors()) { currentValidationData.BusinessErrors.Add(new BusinessWarningOrErrorInfo(error.Message)); } } } else { string businessError = GetWarningOrError(value, ValidationType.Error); if (!string.IsNullOrEmpty(businessError)) { currentValidationData.BusinessErrors.Add(new BusinessWarningOrErrorInfo(businessError)); } } #endregion RaiseEventsForDifferences(value, oldValidationData, currentValidationData); }
private ValidationData CreateValidationData(object value, string propertyChanged, IEnumerable parentEnumerable) { var validationData = new ValidationData(parentEnumerable); if (value is null) { return(validationData); } var validatable = value as IValidatable; CheckObjectValidationForFields(value, propertyChanged, validationData.FieldWarnings, ValidationType.Warning); #region Warnings - business validationData.BusinessWarnings.Clear(); if (validatable != null) { if (!validatable.IsHidingValidationResults) { foreach (var warning in validatable.ValidationContext.GetBusinessRuleWarnings()) { validationData.BusinessWarnings.Add(new BusinessWarningOrErrorInfo(warning.Message)); } } } else { var businessWarning = GetWarningOrError(value, ValidationType.Warning); if (!string.IsNullOrEmpty(businessWarning)) { validationData.BusinessWarnings.Add(new BusinessWarningOrErrorInfo(businessWarning)); } } #endregion CheckObjectValidationForFields(value, propertyChanged, validationData.FieldErrors, ValidationType.Error); #region Errors - business validationData.BusinessErrors.Clear(); if (validatable != null) { if (!validatable.IsHidingValidationResults) { foreach (var error in validatable.ValidationContext.GetBusinessRuleErrors()) { validationData.BusinessErrors.Add(new BusinessWarningOrErrorInfo(error.Message)); } } } else { var businessError = GetWarningOrError(value, ValidationType.Error); if (!string.IsNullOrEmpty(businessError)) { validationData.BusinessErrors.Add(new BusinessWarningOrErrorInfo(businessError)); } } #endregion return(validationData); }