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));
        }
        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));
        }
 public void BeginValidation(IBehaviorContext context, ValidationController controller)
 {
     _validationController.Set(context, controller);
     this.BeginValidationNext(context, controller);
 }
 private void CachePotentiallyInvalidValue(IBehaviorContext context, TValue value)
 {
     _invalidValueCache.Set(context, value);
 }