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
- XamlTemplateSerializer.cs
- CustomAttributeBuilder.cs
- ProgressBar.cs
- DragCompletedEventArgs.cs
- ChtmlMobileTextWriter.cs
- FileDialog.cs
- SqlBulkCopyColumnMapping.cs
- RawStylusSystemGestureInputReport.cs
- InfoCardClaimCollection.cs
- ExceptionUtil.cs
- URLAttribute.cs
- Win32.cs
- SqlMethodCallConverter.cs
- ByteRangeDownloader.cs
- HttpProfileGroupBase.cs
- SignedXml.cs
- ComboBoxRenderer.cs
- SelectionItemPattern.cs
- RuntimeConfigurationRecord.cs
- BatchParser.cs
- ValidatorUtils.cs
- SequentialWorkflowHeaderFooter.cs
- VirtualizingStackPanel.cs
- AssemblyInfo.cs
- SiteMapProvider.cs
- XpsFixedDocumentReaderWriter.cs
- HttpPostedFile.cs
- CacheSection.cs
- WindowsServiceElement.cs
- ProcessModelSection.cs
- CodeGroup.cs
- BitmapEffectDrawingContent.cs
- Lookup.cs
- ConfigXmlComment.cs
- Rotation3DKeyFrameCollection.cs
- RelationshipEnd.cs
- FixedSOMLineRanges.cs
- AQNBuilder.cs
- SymbolPair.cs
- CheckoutException.cs
- AnyAllSearchOperator.cs
- SchemaTableColumn.cs
- DataKey.cs
- TypeGeneratedEventArgs.cs
- ExpressionUtilities.cs
- LineServicesRun.cs
- TextElementCollection.cs
- SelectionListDesigner.cs
- XamlTypeWithExplicitNamespace.cs
- MonitoringDescriptionAttribute.cs
- FontConverter.cs
- PreservationFileWriter.cs
- ReflectTypeDescriptionProvider.cs
- QueryExpr.cs
- CompleteWizardStep.cs
- HandlerFactoryWrapper.cs
- ResourceReader.cs
- ModelFunction.cs
- DecoderBestFitFallback.cs
- CopyAttributesAction.cs
- ControlLocalizer.cs
- DataGridViewButtonColumn.cs
- ObjectContext.cs
- PeerCustomResolverElement.cs
- WindowsIdentity.cs
- XmlSerializationReader.cs
- QilDataSource.cs
- FixedTextContainer.cs
- DocComment.cs
- AutomationFocusChangedEventArgs.cs
- PreviewPrintController.cs
- ConfigurationManager.cs
- WindowsGraphicsWrapper.cs
- COM2Properties.cs
- ReturnEventArgs.cs
- XmlArrayItemAttributes.cs
- Directory.cs
- SetIterators.cs
- IgnoreSectionHandler.cs
- PropertyGridEditorPart.cs
- UnsupportedPolicyOptionsException.cs
- TransformDescriptor.cs
- MobileControlDesigner.cs
- PerformanceCounterLib.cs
- XsltCompileContext.cs
- SQLMoney.cs
- ScrollPattern.cs
- GridViewCancelEditEventArgs.cs
- ScriptBehaviorDescriptor.cs
- AcceptorSessionSymmetricMessageSecurityProtocol.cs
- SdlChannelSink.cs
- MetadataWorkspace.cs
- FileDataSourceCache.cs
- Propagator.ExtentPlaceholderCreator.cs
- EmptyStringExpandableObjectConverter.cs
- EFDataModelProvider.cs
- SettingsSavedEventArgs.cs
- ToolStripRenderEventArgs.cs
- WebPartMovingEventArgs.cs
- ListViewCancelEventArgs.cs