private void CaptureProperty(string property, bool isCollection = false)
        {
            if (_staleProperties.ContainsKey(property))
            {
                _staleProperties.Remove(property);
                OnPropertyChanged(nameof(IsStale));
            }

            if (isCollection)
            {
                var enumerable = (IEnumerable)_viewModel.GetPropertyValue(property);
                var objects    = enumerable?.ToArray();

                if (enumerable is INotifyCollectionChanged collectionChanged &&
                    !_subscriptions.Values.Contains(enumerable))
                {
                    collectionChanged.CollectionChanged += OnCollectionChanged;
                }

                _subscriptions[property]  = enumerable;
                _originalCollectionValues = _originalCollectionValues ?? new Dictionary <string, object[]>();
                CaptureInternalStaleMonitors(enumerable);
                _originalCollectionValues[property] = objects;
            }
            else
            {
                _originalPropertyValues = _originalPropertyValues ?? new Dictionary <string, object>();
                var propertyValue = _viewModel.GetPropertyValue(property);
                _originalPropertyValues[property] = propertyValue;
                if (propertyValue != null && propertyValue is IStaleMonitorViewModel viewModel)
                {
                    viewModel.StaleMonitor?.Capture();
                    if (!_subscriptions.Values.Contains(viewModel) && viewModel.StaleMonitor != null)
                    {
                        viewModel.StaleMonitor.PropertyChanged +=
                            (sender, args) => HandlePropertyChanged(viewModel, property);
                        _subscriptions[property] = viewModel;
                    }
                }
            }
        }
        private bool CheckPropertyIsStale(string property)
        {
            if (_originalPropertyValues?.ContainsKey(property) != true)
            {
                return(false);
            }

            object oldValue = null;
            var    newValue = _viewModel?.GetPropertyValue(property);
            var    isStale  = false;

            if (_originalPropertyValues?.TryGetValue(property, out oldValue) == true)
            {
                isStale = !newValue.ObjectsEqual(oldValue);
            }

            if (!isStale && newValue != null && newValue is IStaleMonitorViewModel viewModel)
            {
                isStale = viewModel.StaleMonitor.IsStale;
            }

            return(isStale);
        }