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)); }