private void RaisePropertyChanged(object sender, PropertyChangedEventArgs e, bool setDirtyAndAllowAutomaticValidation, bool isRefreshCallOnly)
{
if (string.IsNullOrEmpty(e.PropertyName))
{
if (!DisablePropertyChangeNotifications)
{
// Call & exit, we can't handle "update them all" property change notifications
base.RaisePropertyChanged(this, new AdvancedPropertyChangedEventArgs(sender, e.PropertyName));
}
return;
}
// If this is an internal data object base property, just leave
if (IsModelBaseProperty(e.PropertyName))
{
var senderAsModelBase = sender as ModelBase;
if ((senderAsModelBase != null) && (string.Equals(e.PropertyName, IsDirtyProperty.Name, StringComparison.Ordinal)))
{
// Maybe this is a child object informing us that it's not dirty any longer
if (senderAsModelBase.GetValue<bool>(e.PropertyName) == false)
{
if (!ReferenceEquals(this, sender))
{
// Ignore
return;
}
}
// A child became dirty, we are dirty as well
if (!ReferenceEquals(this, sender))
{
IsDirty = true;
}
else
{
if (!DisablePropertyChangeNotifications)
{
// Explicitly call base because we have overridden the behavior
var eventArgs = new AdvancedPropertyChangedEventArgs(sender, this, e.PropertyName);
base.RaisePropertyChanged(this, eventArgs);
}
}
return;
}
}
if (HandlePropertyAndCollectionChanges)
{
if (ReferenceEquals(this, sender))
{
AdvancedPropertyChangedEventArgs eventArgs;
var advancedEventArgs = e as AdvancedPropertyChangedEventArgs;
if (advancedEventArgs != null)
{
eventArgs = new AdvancedPropertyChangedEventArgs(this, advancedEventArgs);
}
else
{
eventArgs = new AdvancedPropertyChangedEventArgs(sender, this, e.PropertyName);
}
if (!isRefreshCallOnly)
{
SuspensionContext callbackSuspensionContext;
lock (_propertyValuesLock)
{
callbackSuspensionContext = _changeCallbacksSuspensionContext;
}
if (callbackSuspensionContext != null)
{
callbackSuspensionContext.Add(e.PropertyName);
}
else if (IsPropertyRegistered(e.PropertyName))
{
var propertyData = GetPropertyData(e.PropertyName);
var handler = propertyData.PropertyChangedEventHandler;
if (handler != null)
{
handler(this, eventArgs);
}
}
}
if (!DisablePropertyChangeNotifications)
{
// Explicitly call base because we have overridden the behavior
base.RaisePropertyChanged(this, eventArgs);
}
}
}
SetDirtyAndAutomaticallyValidate(e.PropertyName, setDirtyAndAllowAutomaticValidation);
}