public static TInheritor DeferNotifyPropertiesOf<TInheritor, TViewModel>(this TInheritor scopeTask, TViewModel viewModel)
            where TInheritor : ScopeTaskBase<TInheritor>, new()
            where TViewModel : IPropertyChangedNotifier
        {
            scopeTask.AddAspects(new PropertyNotificationScopeAspect(
                (obj, props) => PropertyNotificationManager<TViewModel>.PropagateNotification(viewModel, props)));

            return scopeTask;
        }
        public static TInheritor DeferNotifyProperties<TInheritor, TViewModel>(this TInheritor viewModelScopeTask)
            where TInheritor : ViewModelScopeTaskBase<TInheritor, TViewModel>, new()
            where TViewModel : ViewModelBase<TViewModel>
        {
            var viewModel = viewModelScopeTask.ViewModel;
            viewModelScopeTask.AddAspects(new PropertyNotificationScopeAspect(
                (obj, props) => PropertyNotificationManager<TViewModel>.PropagateNotification(viewModel, props)));

            return viewModelScopeTask;
        }
        public static void TryRecordOrElseNotify<TOwner>(ScopeContext scopeContext, TOwner owner, string propertyName, NotifyCollectionChangedEventArgs args, bool isRecordingEnabled)
            where TOwner : IPropertyChangedNotifier
        {
            var notify = false;
            if (scopeContext != null && isRecordingEnabled)
            {
                scopeContext.Get<ScopeRecorder>()
                            ?.Record(scopeContext,
                                     new CollectionChangeRecord(owner, propertyName, args));

                if (!scopeContext.ContainsKey<PropertyNotificationScopeAspect>())
                    notify = true;
            }
            else notify = true;
            if (notify)
                PropertyNotificationManager<TOwner>.PropagateNotification(owner, propertyName);
        }