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
- CustomBindingElement.cs
- RegexFCD.cs
- SmtpCommands.cs
- PromptEventArgs.cs
- __TransparentProxy.cs
- OleDbCommandBuilder.cs
- SafeNativeMethodsOther.cs
- WindowsButton.cs
- WmfPlaceableFileHeader.cs
- ControlPropertyNameConverter.cs
- DataGridViewCellParsingEventArgs.cs
- MgmtConfigurationRecord.cs
- IteratorDescriptor.cs
- ExceptionValidationRule.cs
- ZoneMembershipCondition.cs
- TemplatePropertyEntry.cs
- CommandConverter.cs
- ReadOnlyCollectionBuilder.cs
- OdbcRowUpdatingEvent.cs
- WindowsMenu.cs
- ScrollData.cs
- Compress.cs
- MonthChangedEventArgs.cs
- DataBinding.cs
- DetailsViewRow.cs
- UIAgentAsyncBeginRequest.cs
- CatalogPartCollection.cs
- HostExecutionContextManager.cs
- FuncTypeConverter.cs
- Utils.cs
- DataKeyArray.cs
- PackageProperties.cs
- RequestCacheEntry.cs
- XmlAnyElementAttribute.cs
- SpanIndex.cs
- X509Certificate2.cs
- DataGridViewColumnDesignTimeVisibleAttribute.cs
- ReaderContextStackData.cs
- HitTestFilterBehavior.cs
- QuaternionAnimationBase.cs
- LineVisual.cs
- HtmlControl.cs
- LoginCancelEventArgs.cs
- Synchronization.cs
- RedBlackList.cs
- GridPattern.cs
- XmlNamespaceManager.cs
- Dump.cs
- FocusChangedEventArgs.cs
- FlowLayoutPanel.cs
- MenuItemStyleCollectionEditor.cs
- MarkedHighlightComponent.cs
- SimpleTextLine.cs
- ControlValuePropertyAttribute.cs
- DataColumnChangeEvent.cs
- DynamicResourceExtensionConverter.cs
- TabControl.cs
- ScriptingRoleServiceSection.cs
- TraceXPathNavigator.cs
- ScriptManagerProxy.cs
- SQLDecimal.cs
- AssertSection.cs
- GPPOINTF.cs
- TableLayoutColumnStyleCollection.cs
- _MultipleConnectAsync.cs
- CustomErrorsSection.cs
- UIElementHelper.cs
- ISCIIEncoding.cs
- GenericUriParser.cs
- SqlConnection.cs
- PageCache.cs
- mansign.cs
- PropertyTabChangedEvent.cs
- Button.cs
- StorageComplexPropertyMapping.cs
- EditingCommands.cs
- StylusSystemGestureEventArgs.cs
- HttpRequestCacheValidator.cs
- DataObjectMethodAttribute.cs
- ZipPackagePart.cs
- Soap.cs
- DataMisalignedException.cs
- LinqDataSourceContextEventArgs.cs
- ProcessModelSection.cs
- ScrollItemProviderWrapper.cs
- NumericUpDownAccelerationCollection.cs
- ToolStripManager.cs
- DbConnectionFactory.cs
- Effect.cs
- FileStream.cs
- TypedReference.cs
- ProtocolsSection.cs
- ConnectionInterfaceCollection.cs
- StorageMappingItemLoader.cs
- ImageAttributes.cs
- PathFigureCollection.cs
- PerfCounters.cs
- Console.cs
- BindingExpression.cs
- CleanUpVirtualizedItemEventArgs.cs