private void HandleObjectEventsSubscription(string propertyName, object propertyValue)
{
if (DisableEventSubscriptionsOfChildValues)
{
return;
}
lock (_propertyValuesLock)
{
ChangeNotificationWrapper oldWrapper;
if (_propertyValueChangeNotificationWrappers.TryGetValue(propertyName, out oldWrapper))
{
oldWrapper.PropertyChanged -= OnPropertyObjectPropertyChanged;
oldWrapper.CollectionChanged -= OnPropertyObjectCollectionChanged;
oldWrapper.CollectionItemPropertyChanged -= OnPropertyObjectCollectionItemPropertyChanged;
oldWrapper.UnsubscribeFromAllEvents();
}
if (!ChangeNotificationWrapper.IsUsefulForObject(propertyValue))
{
if (oldWrapper != null)
{
_propertyValueChangeNotificationWrappers.Remove(propertyName);
}
}
else
{
var wrapper = new ChangeNotificationWrapper(propertyValue);
wrapper.PropertyChanged += OnPropertyObjectPropertyChanged;
wrapper.CollectionChanged += OnPropertyObjectCollectionChanged;
wrapper.CollectionItemPropertyChanged += OnPropertyObjectCollectionItemPropertyChanged;
_propertyValueChangeNotificationWrappers[propertyName] = wrapper;
}
}
}