public TValue GetValue(IBehaviorContext context)
        {
            RequireInitialized();

            if (!_cache.HasValue(context))
            {
                if (_isProviding.GetWithDefault(context, false))
                {
                    // This check is important to avoid the following endless recursion:
                    //   1. GetValue calls ProvideValue
                    //   2. ProvideValue directly or indirectly calls GetValue
                    //   3. GetValue calls Provide value because the cache is not set yet.
                    //   4. ProvideValue calls GetValue again
                    //
                    // The alternative would be to return default(TValue) but it is better
                    // to avoid this situation altogehter.
                    throw new InvalidOperationException(EViewModels.ValueAccessedWithinProvideValue);
                }

                _isProviding.Set(context, true);
                TValue value = ProvideValue(context);
                _cache.Set(context, value);
                _isProviding.Clear(context);

                OnInitialize(context);
            }

            return(_cache.Get(context));
        }
        public void Revalidate(IBehaviorContext context)
        {
            ValidationController controller = _validationController.Get(context);
            var validationResult            = controller.GetResult(_step, context.VM, _property);

            bool valueWasInvalid          = _invalidValueCache.HasValue(context);
            bool valueIsNotInvalidAnymore = validationResult.IsValid;

            if (valueWasInvalid && valueIsNotInvalidAnymore)
            {
                TValue previouslyInvalidValue = _invalidValueCache.Get(context);

                _invalidValueCache.Clear(context);
                SetValueNext(context, previouslyInvalidValue);
            }
            else
            {
                this.PropertyRevalidateNext(context);
            }

            _resultManager.UpdateValidationResult(context, validationResult);
        }
        private IEnumerable <TItemSource> GetSourceItems(IBehaviorContext context)
        {
            if (!_shouldCacheSourceCollection)
            {
                IEnumerable <TItemSource> source = this.GetValueNext <IEnumerable <TItemSource> >(context);
                return(source);
            }

            if (!_collectionSourceCache.HasValue(context))
            {
                IEnumerable <TItemSource> source = this.GetValueNext <IEnumerable <TItemSource> >(context);
                _collectionSourceCache.Set(context, source);
            }

            return(_collectionSourceCache.Get(context));
        }