Code:
/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / cdf / src / NetFx40 / System.Activities / System / Activities / WorkflowDataContext.cs / 1305376 / WorkflowDataContext.cs
//------------------------------------------------------------------------------ // Copyright (c) Microsoft Corporation. All rights reserved. //----------------------------------------------------------------------------- namespace System.Activities { using System; using System.Activities.Hosting; using System.Activities.Runtime; using System.Collections.Generic; using System.ComponentModel; using System.Runtime; [Fx.Tag.XamlVisible(false)] public sealed class WorkflowDataContext : CustomTypeDescriptor, INotifyPropertyChanged, IDisposable { ActivityExecutor executor; ActivityInstance activityInstance; IDictionarylocationMapping; PropertyChangedEventHandler propertyChangedEventHandler; PropertyDescriptorCollection properties; ActivityContext cachedResolutionContext; internal WorkflowDataContext(ActivityExecutor executor, ActivityInstance activityInstance) { this.executor = executor; this.activityInstance = activityInstance; this.properties = CreateProperties(); } public event PropertyChangedEventHandler PropertyChanged; // We want our own cached ActivityContext rather than using this.executor.GetResolutionContext // because there is no synchronization of access to the executor's cached object and access thru // this WorkflowDataContext will not be done on the workflow runtime thread. ActivityContext ResolutionContext { get { if (this.cachedResolutionContext == null) { this.cachedResolutionContext = new ActivityContext(this.activityInstance, this.executor); this.cachedResolutionContext.AllowChainedEnvironmentAccess = true; } else { this.cachedResolutionContext.Reinitialize(this.activityInstance, this.executor); } return this.cachedResolutionContext; } } PropertyChangedEventHandler PropertyChangedEventHandler { get { if (this.propertyChangedEventHandler == null) { this.propertyChangedEventHandler = new PropertyChangedEventHandler(this.OnLocationChanged); } return this.propertyChangedEventHandler; } } PropertyDescriptorCollection CreateProperties() { // The name in child Activity will shadow the name in parent. Dictionary names = new Dictionary (); List propertyList = new List (); LocationReferenceEnvironment environment = this.activityInstance.Activity.PublicEnvironment; while (environment != null) { foreach (LocationReference locRef in environment.GetLocationReferences()) { AddProperty(locRef, names, propertyList); } environment = environment.Parent; } return new PropertyDescriptorCollection(propertyList.ToArray(), true); } void AddProperty(LocationReference reference, Dictionary names, List propertyList) { if (!string.IsNullOrEmpty(reference.Name) && !names.ContainsKey(reference.Name)) { names.Add(reference.Name, reference); PropertyDescriptorImpl property = new PropertyDescriptorImpl(reference); propertyList.Add(property); AddNotifyHandler(property); } } void AddNotifyHandler(PropertyDescriptorImpl property) { ActivityContext activityContext = this.ResolutionContext; try { Location location = property.LocationReference.GetLocation(activityContext); INotifyPropertyChanged notify = location as INotifyPropertyChanged; if (notify != null) { notify.PropertyChanged += PropertyChangedEventHandler; if (this.locationMapping == null) { this.locationMapping = new Dictionary (); } this.locationMapping.Add(location, property); } } finally { activityContext.Dispose(); } } void OnLocationChanged(object sender, PropertyChangedEventArgs e) { PropertyChangedEventHandler handler = this.PropertyChanged; if (handler != null) { Location location = (Location)sender; Fx.Assert(this.locationMapping != null, "Location mapping must not be null."); PropertyDescriptorImpl property; if (this.locationMapping.TryGetValue(location, out property)) { if (e.PropertyName == "Value") { handler(this, new PropertyChangedEventArgs(property.Name)); } else { handler(this, new PropertyChangedEventArgs(property.Name + "." + e.PropertyName)); } } } } public void Dispose() { if (this.locationMapping != null) { foreach (KeyValuePair pair in this.locationMapping) { INotifyPropertyChanged notify = pair.Value as INotifyPropertyChanged; if (notify != null) { notify.PropertyChanged -= PropertyChangedEventHandler; } } } } public override PropertyDescriptorCollection GetProperties() { return this.properties; } class PropertyDescriptorImpl : PropertyDescriptor { LocationReference reference; // public PropertyDescriptorImpl(LocationReference reference) : base(reference.Name, new Attribute[0]) { this.reference = reference; } public override Type ComponentType { get { return typeof(WorkflowDataContext); } } public override bool IsReadOnly { get { // return false; } } public override Type PropertyType { get { return this.reference.Type; } } public LocationReference LocationReference { get { return this.reference; } } public override bool CanResetValue(object component) { return false; } public override object GetValue(object component) { WorkflowDataContext dataContext = (WorkflowDataContext)component; ActivityContext activityContext = dataContext.ResolutionContext; try { return this.reference.GetLocation(activityContext).Value; } finally { activityContext.Dispose(); } } public override void ResetValue(object component) { throw FxTrace.Exception.AsError(new NotSupportedException(SR.CannotResetPropertyInDataContext)); } public override void SetValue(object component, object value) { if (IsReadOnly) { throw FxTrace.Exception.AsError(new NotSupportedException(SR.PropertyReadOnlyInWorkflowDataContext(this.Name))); } WorkflowDataContext dataContext = (WorkflowDataContext)component; ActivityContext activityContext = dataContext.ResolutionContext; try { Location location = this.reference.GetLocation(activityContext); location.Value = value; } finally { activityContext.Dispose(); } } public override bool ShouldSerializeValue(object component) { return true; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- PageEventArgs.cs
- DocumentSchemaValidator.cs
- OleAutBinder.cs
- TextTrailingWordEllipsis.cs
- CredentialSelector.cs
- SecureStringHasher.cs
- OleDbParameterCollection.cs
- DataObject.cs
- ForEachAction.cs
- WebEvents.cs
- Relationship.cs
- WindowShowOrOpenTracker.cs
- CodeTypeDeclarationCollection.cs
- SqlMethodCallConverter.cs
- HelloMessageCD1.cs
- WmlSelectionListAdapter.cs
- CommandField.cs
- KoreanLunisolarCalendar.cs
- QueryContinueDragEvent.cs
- DetailsViewDeleteEventArgs.cs
- BindStream.cs
- CounterSampleCalculator.cs
- Typography.cs
- ColorPalette.cs
- KeySpline.cs
- HeaderPanel.cs
- Setter.cs
- BeginStoryboard.cs
- LinqExpressionNormalizer.cs
- TransportOutputChannel.cs
- IRCollection.cs
- PropertyGridEditorPart.cs
- PolicyUnit.cs
- ProfileService.cs
- LocationUpdates.cs
- PathFigure.cs
- AmbientLight.cs
- FixedPage.cs
- EntityDataSourceView.cs
- PasswordDeriveBytes.cs
- ChineseLunisolarCalendar.cs
- ProgressBar.cs
- VariableReference.cs
- HttpPostedFile.cs
- IndependentAnimationStorage.cs
- CodeTypeMember.cs
- ConfigXmlSignificantWhitespace.cs
- DockAndAnchorLayout.cs
- XsltSettings.cs
- _SecureChannel.cs
- Empty.cs
- FontDifferentiator.cs
- Dictionary.cs
- KeyPressEvent.cs
- ReflectEventDescriptor.cs
- DbSetClause.cs
- VisualBrush.cs
- UnsafeNativeMethods.cs
- BoolExpression.cs
- MailAddressCollection.cs
- IERequestCache.cs
- ExeContext.cs
- DataStreamFromComStream.cs
- BindingCompleteEventArgs.cs
- CanonicalXml.cs
- MappingItemCollection.cs
- PriorityBindingExpression.cs
- DbFunctionCommandTree.cs
- ErrorWrapper.cs
- Events.cs
- XamlBrushSerializer.cs
- WebRequestModulesSection.cs
- ErrorInfoXmlDocument.cs
- IPipelineRuntime.cs
- FileInfo.cs
- RectangleHotSpot.cs
- MediaContext.cs
- FrameAutomationPeer.cs
- SafeFileHandle.cs
- IndicShape.cs
- TemplateBamlRecordReader.cs
- BindToObject.cs
- UnmanagedMemoryStream.cs
- unsafeIndexingFilterStream.cs
- InheritanceService.cs
- ServiceDescriptionSerializer.cs
- UnicodeEncoding.cs
- ParserContext.cs
- Pkcs9Attribute.cs
- XmlNode.cs
- EditingCoordinator.cs
- MultipartContentParser.cs
- MetadataItemEmitter.cs
- Debugger.cs
- SyndicationSerializer.cs
- SizeIndependentAnimationStorage.cs
- DesignTimeVisibleAttribute.cs
- Module.cs
- Hash.cs
- EndpointNotFoundException.cs