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
- ListItemParagraph.cs
- HashStream.cs
- CompilerParameters.cs
- RowVisual.cs
- DataSet.cs
- VariantWrapper.cs
- TranslateTransform.cs
- XmlSerializerNamespaces.cs
- HashRepartitionEnumerator.cs
- StatusBarDrawItemEvent.cs
- SessionState.cs
- WebSysDefaultValueAttribute.cs
- Mapping.cs
- Floater.cs
- LocalizedNameDescriptionPair.cs
- SchemaNotation.cs
- BuildProviderCollection.cs
- ClientType.cs
- BitmapEffectInputConnector.cs
- GridItemProviderWrapper.cs
- ToolStripButton.cs
- ObjectAnimationUsingKeyFrames.cs
- FileResponseElement.cs
- NamespaceMapping.cs
- Margins.cs
- ToolStripDesigner.cs
- _SafeNetHandles.cs
- ItemList.cs
- diagnosticsswitches.cs
- ListViewHitTestInfo.cs
- XsdBuilder.cs
- ErrorFormatterPage.cs
- StyleModeStack.cs
- WebPartZone.cs
- SimpleExpression.cs
- ProviderIncompatibleException.cs
- PropertySourceInfo.cs
- GridViewUpdateEventArgs.cs
- VarInfo.cs
- PenThreadPool.cs
- LabelEditEvent.cs
- CalendarDay.cs
- CompatibleIComparer.cs
- InternalSafeNativeMethods.cs
- IItemContainerGenerator.cs
- RightsDocument.cs
- KnownBoxes.cs
- TextFormatter.cs
- MissingMemberException.cs
- Image.cs
- followingquery.cs
- dataobject.cs
- SerialPinChanges.cs
- SingleKeyFrameCollection.cs
- NotifyCollectionChangedEventArgs.cs
- RegexStringValidatorAttribute.cs
- TextTreeTextNode.cs
- ActivationArguments.cs
- _ListenerResponseStream.cs
- TransformCollection.cs
- Converter.cs
- ModelPropertyImpl.cs
- PreviewPrintController.cs
- bidPrivateBase.cs
- LayoutTable.cs
- FormViewPagerRow.cs
- returneventsaver.cs
- MemberCollection.cs
- TdsParserSessionPool.cs
- TemplateControlCodeDomTreeGenerator.cs
- XPathNavigatorReader.cs
- StackOverflowException.cs
- ContentWrapperAttribute.cs
- WindowInteropHelper.cs
- NotConverter.cs
- TypeConverterHelper.cs
- TextView.cs
- HttpCachePolicy.cs
- DataGridViewCellStyle.cs
- NameValuePair.cs
- FontStyleConverter.cs
- DataBoundLiteralControl.cs
- XslTransform.cs
- remotingproxy.cs
- Query.cs
- RequestTimeoutManager.cs
- ManualResetEvent.cs
- HttpStaticObjectsCollectionWrapper.cs
- SqlProvider.cs
- CssTextWriter.cs
- SqlCommandBuilder.cs
- WebBrowserPermission.cs
- LiteralControl.cs
- EpmSyndicationContentDeSerializer.cs
- TextSerializer.cs
- ParserOptions.cs
- UnsafeNativeMethods.cs
- Span.cs
- FontClient.cs
- FormatSettings.cs