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);
}