Code:
/ 4.0 / 4.0 / untmp / 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.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- EntityTypeBase.cs
- SoapObjectWriter.cs
- DbSetClause.cs
- EntityDataSourceSelectedEventArgs.cs
- ProcessModelInfo.cs
- SystemColors.cs
- ChannelManager.cs
- ListControlConvertEventArgs.cs
- CheckedListBox.cs
- SqlBooleanMismatchVisitor.cs
- RelationshipType.cs
- recordstatescratchpad.cs
- ChangePassword.cs
- BindingMemberInfo.cs
- ThreadAbortException.cs
- ListenUriMode.cs
- StatusInfoItem.cs
- Label.cs
- FastEncoderWindow.cs
- LinkedResource.cs
- CharEnumerator.cs
- CalloutQueueItem.cs
- TraceData.cs
- BamlMapTable.cs
- HtmlImageAdapter.cs
- LinqDataView.cs
- RoleGroup.cs
- Column.cs
- DataGridViewCellPaintingEventArgs.cs
- SessionState.cs
- EncoderNLS.cs
- OdbcReferenceCollection.cs
- SafeFindHandle.cs
- EncoderFallback.cs
- TagNameToTypeMapper.cs
- ConfigPathUtility.cs
- Nullable.cs
- SpecialFolderEnumConverter.cs
- VectorAnimation.cs
- DataGridAddNewRow.cs
- PointLightBase.cs
- MediaTimeline.cs
- InvalidFilterCriteriaException.cs
- BinHexEncoder.cs
- DesignBindingPropertyDescriptor.cs
- CodePageEncoding.cs
- DecimalKeyFrameCollection.cs
- SplitterDesigner.cs
- ProgressChangedEventArgs.cs
- CollectionBuilder.cs
- PropertyEmitterBase.cs
- TargetFrameworkAttribute.cs
- MailWebEventProvider.cs
- SynchronizedMessageSource.cs
- CacheAxisQuery.cs
- TableItemProviderWrapper.cs
- HostDesigntimeLicenseContext.cs
- WebPartEditorCancelVerb.cs
- TextLine.cs
- ProtocolViolationException.cs
- AttributeUsageAttribute.cs
- UniqueCodeIdentifierScope.cs
- DocumentNUp.cs
- HtmlEmptyTagControlBuilder.cs
- CodeStatement.cs
- AsymmetricKeyExchangeDeformatter.cs
- TimeSpanConverter.cs
- CfgRule.cs
- ResourceDefaultValueAttribute.cs
- XPathParser.cs
- CollectionBuilder.cs
- TextServicesManager.cs
- Adorner.cs
- UmAlQuraCalendar.cs
- MatrixAnimationUsingPath.cs
- FullTrustAssembly.cs
- DataColumnMapping.cs
- TrackingStringDictionary.cs
- CallSiteHelpers.cs
- PathStreamGeometryContext.cs
- XamlSerializer.cs
- Validator.cs
- SecUtil.cs
- BinaryWriter.cs
- CreateUserErrorEventArgs.cs
- OutputScopeManager.cs
- InputBuffer.cs
- PopupRoot.cs
- HttpListenerRequest.cs
- AstTree.cs
- CannotUnloadAppDomainException.cs
- SqlProfileProvider.cs
- CompModSwitches.cs
- DataGridCellsPanel.cs
- NavigationPropertyEmitter.cs
- EditorPartChrome.cs
- TransformerInfo.cs
- ServiceModelSecurityTokenTypes.cs
- MarkupExtensionParser.cs
- TableLayoutRowStyleCollection.cs