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
- XmlArrayItemAttribute.cs
- DispatcherTimer.cs
- SafeEventHandle.cs
- ReflectTypeDescriptionProvider.cs
- SmiXetterAccessMap.cs
- Int64Converter.cs
- HttpStreamMessage.cs
- DrawingContextDrawingContextWalker.cs
- XmlSchemaSimpleContentRestriction.cs
- FormsAuthenticationConfiguration.cs
- Drawing.cs
- ComponentResourceManager.cs
- SqlFormatter.cs
- StickyNoteContentControl.cs
- baseaxisquery.cs
- ChildTable.cs
- EnumMember.cs
- MouseButton.cs
- InstallHelper.cs
- ImageMapEventArgs.cs
- TileBrush.cs
- TextFragmentEngine.cs
- PreApplicationStartMethodAttribute.cs
- StructuredTypeInfo.cs
- Tablet.cs
- MenuCommand.cs
- ConfigurationSchemaErrors.cs
- ValidationError.cs
- GenericRootAutomationPeer.cs
- CodeObjectCreateExpression.cs
- ContentElementCollection.cs
- translator.cs
- Renderer.cs
- TemplatedWizardStep.cs
- UpDownBase.cs
- ResourceType.cs
- BitmapScalingModeValidation.cs
- PassportIdentity.cs
- XamlPathDataSerializer.cs
- SapiGrammar.cs
- DockProviderWrapper.cs
- AssociationSetMetadata.cs
- EmptyControlCollection.cs
- WSDualHttpSecurityMode.cs
- FunctionImportMapping.cs
- HashCodeCombiner.cs
- EditorZoneBase.cs
- DbException.cs
- ColumnHeader.cs
- InternalControlCollection.cs
- _emptywebproxy.cs
- TextElementEnumerator.cs
- XhtmlBasicLinkAdapter.cs
- CodeTypeDeclaration.cs
- RegexStringValidatorAttribute.cs
- ConsoleKeyInfo.cs
- RtfToXamlLexer.cs
- Line.cs
- Rotation3DAnimationBase.cs
- CodePrimitiveExpression.cs
- StatusBarItem.cs
- BinaryMessageEncodingBindingElement.cs
- PropertyGridEditorPart.cs
- UInt16Converter.cs
- FrameworkContentElement.cs
- ComplexLine.cs
- MergeLocalizationDirectives.cs
- MonikerSyntaxException.cs
- StackBuilderSink.cs
- FreezableOperations.cs
- EntityModelBuildProvider.cs
- SoapFormatter.cs
- FixedSOMImage.cs
- DashStyle.cs
- XmlAttributeAttribute.cs
- Nullable.cs
- DataGridViewCellPaintingEventArgs.cs
- ConfigurationSettings.cs
- InfoCardRSACryptoProvider.cs
- OracleFactory.cs
- ResourceDescriptionAttribute.cs
- WebBrowserSiteBase.cs
- SizeFConverter.cs
- GeometryGroup.cs
- EmptyTextWriter.cs
- VerticalAlignConverter.cs
- EditingContext.cs
- XmlProcessingInstruction.cs
- ProfileSection.cs
- ServiceBusyException.cs
- CodeAccessSecurityEngine.cs
- DeadCharTextComposition.cs
- ConfigXmlDocument.cs
- XsdBuilder.cs
- ToolStripLocationCancelEventArgs.cs
- MetadataItemEmitter.cs
- HtmlInputButton.cs
- TemplateField.cs
- CharAnimationUsingKeyFrames.cs
- IPGlobalProperties.cs