Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / DataEntity / System / Data / Objects / ObjectViewListener.cs / 1305376 / ObjectViewListener.cs
//---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data.Objects.DataClasses; using System.Diagnostics; // Dev notes -1 // why we need this class: in order to keep the view alive, we have to listen to evens from entities and // also EntityCollection/ObjectStateManager they exists in. listening to event will prevent the view to be // disposed, hence GC'ed due to having a strong reference; and to avoid this situation we have to introduce // a new layer which will have a weakreference to view (1-so it can go out of scope, 2- this layer will listen to // the events and notify the view - by calling its APIS- for any change that happens) // Dev notes -2 // following statement is valid on current existing CLR: // lets say Customer is an Entity, Array[Customer] is not Array[Entity]; it is not supported // to do the work around we have to use a non-Generic interface/class so we can pass the view // to ObjectViewListener safely (IObjectView) namespace System.Data.Objects { internal sealed class ObjectViewListener { private WeakReference _viewWeak; private object _dataSource; private IList _list; internal ObjectViewListener(IObjectView view, IList list, object dataSource) { _viewWeak = new WeakReference(view); _dataSource = dataSource; _list = list; RegisterCollectionEvents(); RegisterEntityEvents(); } private void CleanUpListener() { UnregisterCollectionEvents(); UnregisterEntityEvents(); } private void RegisterCollectionEvents() { ObjectStateManager cache = _dataSource as ObjectStateManager; if (cache != null) { cache.EntityDeleted += CollectionChanged; } else if (null != _dataSource) { ((RelatedEnd)_dataSource).AssociationChangedForObjectView += CollectionChanged; } } private void UnregisterCollectionEvents() { ObjectStateManager cache = _dataSource as ObjectStateManager; if (cache != null) { cache.EntityDeleted -= CollectionChanged; } else if (null != _dataSource) { ((RelatedEnd)_dataSource).AssociationChangedForObjectView -= CollectionChanged; } } internal void RegisterEntityEvents(object entity) { Debug.Assert(entity != null, "Entity should not be null"); INotifyPropertyChanged propChanged = entity as INotifyPropertyChanged; if (propChanged != null) { propChanged.PropertyChanged += EntityPropertyChanged; } } private void RegisterEntityEvents() { if (null != _list) { foreach (object entityObject in _list) { INotifyPropertyChanged propChanged = entityObject as INotifyPropertyChanged; if (propChanged != null) { propChanged.PropertyChanged += EntityPropertyChanged; } } } } internal void UnregisterEntityEvents(object entity) { Debug.Assert(entity != null, "entity should not be null"); INotifyPropertyChanged propChanged = entity as INotifyPropertyChanged; if (propChanged != null) { propChanged.PropertyChanged -= EntityPropertyChanged; } } private void UnregisterEntityEvents() { if (null != _list) { foreach (object entityObject in _list) { INotifyPropertyChanged propChanged = entityObject as INotifyPropertyChanged; if (propChanged != null) { propChanged.PropertyChanged -= EntityPropertyChanged; } } } } private void EntityPropertyChanged(object sender, PropertyChangedEventArgs e) { IObjectView view = (IObjectView)_viewWeak.Target; if (view != null) { view.EntityPropertyChanged(sender, e); } else { CleanUpListener(); } } private void CollectionChanged(object sender, CollectionChangeEventArgs e) { IObjectView view = (IObjectView)_viewWeak.Target; if (view != null) { view.CollectionChanged(sender, e); } else { CleanUpListener(); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. //---------------------------------------------------------------------- //// Copyright (c) Microsoft Corporation. All rights reserved. // // // @owner [....] // @backupOwner [....] //--------------------------------------------------------------------- using System; using System.Collections; using System.Collections.Generic; using System.ComponentModel; using System.Data.Objects.DataClasses; using System.Diagnostics; // Dev notes -1 // why we need this class: in order to keep the view alive, we have to listen to evens from entities and // also EntityCollection/ObjectStateManager they exists in. listening to event will prevent the view to be // disposed, hence GC'ed due to having a strong reference; and to avoid this situation we have to introduce // a new layer which will have a weakreference to view (1-so it can go out of scope, 2- this layer will listen to // the events and notify the view - by calling its APIS- for any change that happens) // Dev notes -2 // following statement is valid on current existing CLR: // lets say Customer is an Entity, Array[Customer] is not Array[Entity]; it is not supported // to do the work around we have to use a non-Generic interface/class so we can pass the view // to ObjectViewListener safely (IObjectView) namespace System.Data.Objects { internal sealed class ObjectViewListener { private WeakReference _viewWeak; private object _dataSource; private IList _list; internal ObjectViewListener(IObjectView view, IList list, object dataSource) { _viewWeak = new WeakReference(view); _dataSource = dataSource; _list = list; RegisterCollectionEvents(); RegisterEntityEvents(); } private void CleanUpListener() { UnregisterCollectionEvents(); UnregisterEntityEvents(); } private void RegisterCollectionEvents() { ObjectStateManager cache = _dataSource as ObjectStateManager; if (cache != null) { cache.EntityDeleted += CollectionChanged; } else if (null != _dataSource) { ((RelatedEnd)_dataSource).AssociationChangedForObjectView += CollectionChanged; } } private void UnregisterCollectionEvents() { ObjectStateManager cache = _dataSource as ObjectStateManager; if (cache != null) { cache.EntityDeleted -= CollectionChanged; } else if (null != _dataSource) { ((RelatedEnd)_dataSource).AssociationChangedForObjectView -= CollectionChanged; } } internal void RegisterEntityEvents(object entity) { Debug.Assert(entity != null, "Entity should not be null"); INotifyPropertyChanged propChanged = entity as INotifyPropertyChanged; if (propChanged != null) { propChanged.PropertyChanged += EntityPropertyChanged; } } private void RegisterEntityEvents() { if (null != _list) { foreach (object entityObject in _list) { INotifyPropertyChanged propChanged = entityObject as INotifyPropertyChanged; if (propChanged != null) { propChanged.PropertyChanged += EntityPropertyChanged; } } } } internal void UnregisterEntityEvents(object entity) { Debug.Assert(entity != null, "entity should not be null"); INotifyPropertyChanged propChanged = entity as INotifyPropertyChanged; if (propChanged != null) { propChanged.PropertyChanged -= EntityPropertyChanged; } } private void UnregisterEntityEvents() { if (null != _list) { foreach (object entityObject in _list) { INotifyPropertyChanged propChanged = entityObject as INotifyPropertyChanged; if (propChanged != null) { propChanged.PropertyChanged -= EntityPropertyChanged; } } } } private void EntityPropertyChanged(object sender, PropertyChangedEventArgs e) { IObjectView view = (IObjectView)_viewWeak.Target; if (view != null) { view.EntityPropertyChanged(sender, e); } else { CleanUpListener(); } } private void CollectionChanged(object sender, CollectionChangeEventArgs e) { IObjectView view = (IObjectView)_viewWeak.Target; if (view != null) { view.CollectionChanged(sender, e); } else { CleanUpListener(); } } } } // 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
- XmlSchemaIdentityConstraint.cs
- PageStatePersister.cs
- SrgsRule.cs
- FileChangesMonitor.cs
- ReadContentAsBinaryHelper.cs
- ModelItemCollectionImpl.cs
- ToolStripArrowRenderEventArgs.cs
- ProgressiveCrcCalculatingStream.cs
- ConnectionsZone.cs
- DispatcherHookEventArgs.cs
- Bind.cs
- ProcessModelInfo.cs
- X509Certificate2Collection.cs
- SqlGatherConsumedAliases.cs
- ToolStripContentPanel.cs
- Encoding.cs
- StylusTouchDevice.cs
- DeobfuscatingStream.cs
- XamlRtfConverter.cs
- Regex.cs
- XmlElementList.cs
- DynamicPhysicalDiscoSearcher.cs
- SettingsPropertyNotFoundException.cs
- GlobalAclOperationRequirement.cs
- ObjectStorage.cs
- CodeCompiler.cs
- SchemaCollectionCompiler.cs
- Certificate.cs
- WebBrowserNavigatingEventHandler.cs
- EdmSchemaError.cs
- HttpModuleAction.cs
- parserscommon.cs
- ProviderMetadata.cs
- WpfSharedBamlSchemaContext.cs
- XmlNotation.cs
- ShortcutKeysEditor.cs
- BitVec.cs
- BamlWriter.cs
- InstallerTypeAttribute.cs
- WebPartMovingEventArgs.cs
- ApplicationId.cs
- FilteredDataSetHelper.cs
- BinaryKeyIdentifierClause.cs
- ToolStripRenderer.cs
- SqlDataSourceEnumerator.cs
- DataGridViewTopLeftHeaderCell.cs
- SocketException.cs
- HttpRawResponse.cs
- TableDetailsCollection.cs
- SQLStringStorage.cs
- Utilities.cs
- TextDpi.cs
- SmiMetaData.cs
- ParseChildrenAsPropertiesAttribute.cs
- FileDialogCustomPlace.cs
- ClientData.cs
- TypographyProperties.cs
- BindingSource.cs
- Visual3DCollection.cs
- CharacterMetrics.cs
- SQLInt16.cs
- SQLDecimalStorage.cs
- AppDomainManager.cs
- RelationshipManager.cs
- FormViewCommandEventArgs.cs
- SapiGrammar.cs
- CroppedBitmap.cs
- AsyncOperationManager.cs
- Model3DGroup.cs
- ProfileService.cs
- ComEventsMethod.cs
- TextRangeEditLists.cs
- StackOverflowException.cs
- EdmProviderManifest.cs
- MatrixCamera.cs
- Converter.cs
- CompilerWrapper.cs
- StrongNameKeyPair.cs
- ChtmlTextWriter.cs
- PackWebResponse.cs
- SqlFacetAttribute.cs
- TextBoxDesigner.cs
- WinInet.cs
- WpfGeneratedKnownProperties.cs
- DesignerInterfaces.cs
- AudioStateChangedEventArgs.cs
- HMACSHA512.cs
- PipeStream.cs
- EmptyControlCollection.cs
- OleDbMetaDataFactory.cs
- BitArray.cs
- LogWriteRestartAreaState.cs
- XmlAttributeCollection.cs
- Cursors.cs
- LogicalTreeHelper.cs
- Matrix.cs
- MetadataArtifactLoader.cs
- WebPartDescriptionCollection.cs
- ScriptControl.cs
- UrlAuthorizationModule.cs