Index: Core/Components/src/Core.Components.DotSpatial.Forms/MapControl.cs =================================================================== diff -u -r99f3b343f5ac4aed453d9f6d291217de76ef5314 -r41af8c6e09c689cd4195e25bffca11ecb77b9035 --- Core/Components/src/Core.Components.DotSpatial.Forms/MapControl.cs (.../MapControl.cs) (revision 99f3b343f5ac4aed453d9f6d291217de76ef5314) +++ Core/Components/src/Core.Components.DotSpatial.Forms/MapControl.cs (.../MapControl.cs) (revision 41af8c6e09c689cd4195e25bffca11ecb77b9035) @@ -36,7 +36,7 @@ /// /// This class describes a map view with configured projection and function mode. /// - public sealed class MapControl : Control, IMapControl, IObserver + public sealed class MapControl : Control, IMapControl { private readonly Cursor defaultCursor = Cursors.Default; private readonly MapFeatureLayerFactory mapFeatureLayerFactory = new MapFeatureLayerFactory(); @@ -46,6 +46,8 @@ private MapFunctionSelectionZoom mapFunctionSelectionZoom; private MouseCoordinatesMapExtension mouseCoordinatesMapExtension; + private readonly RecursiveObserver mapDataObserver; + /// /// Creates a new instance of . /// @@ -55,8 +57,12 @@ TogglePanning(); Data = new MapDataCollection("Root"); - Data.Attach(this); + mapDataObserver = new RecursiveObserver(DrawFeatureSets, mdc => mdc.Collection) + { + Observable = Data + }; + DrawFeatureSets(); } @@ -116,15 +122,12 @@ Data = null; } - public void UpdateObserver() - { - DrawFeatureSets(); - } - protected override void Dispose(bool disposing) { map.Dispose(); mouseCoordinatesMapExtension.Dispose(); + mapDataObserver.Dispose(); + base.Dispose(disposing); } Index: Core/Components/test/Core.Components.DotSpatial.Forms.Test/MapControlTest.cs =================================================================== diff -u -r24da3aa72ccc0776599628c9f971081694048d9a -r41af8c6e09c689cd4195e25bffca11ecb77b9035 --- Core/Components/test/Core.Components.DotSpatial.Forms.Test/MapControlTest.cs (.../MapControlTest.cs) (revision 24da3aa72ccc0776599628c9f971081694048d9a) +++ Core/Components/test/Core.Components.DotSpatial.Forms.Test/MapControlTest.cs (.../MapControlTest.cs) (revision 41af8c6e09c689cd4195e25bffca11ecb77b9035) @@ -94,30 +94,49 @@ } [Test] - public void UpdateObserver_UpdateData_UpdateMap() + public void GivenMapControlWithMapData_WhenNestedMapDataAdded_MapControlUpdated() { - // Setup + // Given using (var map = new MapControl()) { var mapView = map.Controls.OfType().First(); var testData = new MapPointData("test data"); + // When map.Data.Add(testData); - map.UpdateObserver(); + map.Data.NotifyObservers(); - // Precondition + // Then Assert.AreEqual(1, mapView.Layers.Count); Assert.IsInstanceOf(mapView.Layers[0]); + } + } - map.Data.Add(new MapLineData("test data")); + [Test] + [RequiresSTA] + public void GivenMapControlWithNestedMapData_WhenNestedMapDataChanged_MapControlUpdated() + { + // Given + using (var form = new Form()) + { + var map = new MapControl(); + var testData = new MapPointData("test data"); + var view = map.Controls.OfType().First(); + map.Data.Add(testData); + map.Data.NotifyObservers(); + + form.Controls.Add(map); + form.Show(); + + var layers = view.Layers.ToList(); + // Call - map.UpdateObserver(); + testData.NotifyObservers(); // Assert - Assert.AreEqual(2, mapView.Layers.Count); - Assert.IsInstanceOf(mapView.Layers[0]); - Assert.IsInstanceOf(mapView.Layers[1]); + Assert.AreEqual(1, view.Layers.Count); + Assert.AreNotSame(layers[0], view.Layers[0]); } } @@ -503,35 +522,6 @@ [Test] [RequiresSTA] - public void UpdateObserver_MapInForm_MapLayersRenewed() - { - // Setup - using (var form = new Form()) - { - var map = new MapControl(); - var testData = new MapPointData("test data"); - var view = map.Controls.OfType().First(); - - map.Data.Add(testData); - map.Data.NotifyObservers(); - - var layers = view.Layers.ToList(); - - form.Controls.Add(map); - - form.Show(); - - // Call - map.UpdateObserver(); - - // Assert - Assert.AreEqual(1, view.Layers.Count); - Assert.AreNotSame(layers[0], view.Layers[0]); - } - } - - [Test] - [RequiresSTA] public void ToggleRectangleZooming_Always_CorrectlySetsMapFunctions() { using (var form = new Form())