Index: Core/Common/src/Core.Common.Gui/Forms/PropertyGridView/PropertyGridView.cs =================================================================== diff -u -re217c241d1d57575c99e1062b449ea595f9fc764 -r1ab3d180b9a6ea55959a33564b11bea9a10db3c8 --- Core/Common/src/Core.Common.Gui/Forms/PropertyGridView/PropertyGridView.cs (.../PropertyGridView.cs) (revision e217c241d1d57575c99e1062b449ea595f9fc764) +++ Core/Common/src/Core.Common.Gui/Forms/PropertyGridView/PropertyGridView.cs (.../PropertyGridView.cs) (revision 1ab3d180b9a6ea55959a33564b11bea9a10db3c8) @@ -136,7 +136,9 @@ if (objectProperties != null) { objectProperties.RefreshRequired -= HandleRefreshRequired; - objectProperties.Dispose(); + + var disposableObjectProperties = objectProperties as IDisposable; + disposableObjectProperties?.Dispose(); } } Index: Core/Common/src/Core.Common.Gui/PropertyBag/IObjectProperties.cs =================================================================== diff -u -re217c241d1d57575c99e1062b449ea595f9fc764 -r1ab3d180b9a6ea55959a33564b11bea9a10db3c8 --- Core/Common/src/Core.Common.Gui/PropertyBag/IObjectProperties.cs (.../IObjectProperties.cs) (revision e217c241d1d57575c99e1062b449ea595f9fc764) +++ Core/Common/src/Core.Common.Gui/PropertyBag/IObjectProperties.cs (.../IObjectProperties.cs) (revision 1ab3d180b9a6ea55959a33564b11bea9a10db3c8) @@ -26,7 +26,7 @@ /// /// Interface for object properties. /// - public interface IObjectProperties : IDisposable + public interface IObjectProperties { /// /// Gets or sets the data of the object properties. Index: Core/Common/src/Core.Common.Gui/PropertyBag/ObjectProperties.cs =================================================================== diff -u -r9a4eded3d7de675594c149438dbc9512674cc5c2 -r1ab3d180b9a6ea55959a33564b11bea9a10db3c8 --- Core/Common/src/Core.Common.Gui/PropertyBag/ObjectProperties.cs (.../ObjectProperties.cs) (revision 9a4eded3d7de675594c149438dbc9512674cc5c2) +++ Core/Common/src/Core.Common.Gui/PropertyBag/ObjectProperties.cs (.../ObjectProperties.cs) (revision 1ab3d180b9a6ea55959a33564b11bea9a10db3c8) @@ -29,7 +29,7 @@ /// Base class for object properties with data of type . /// /// Type of . - public class ObjectProperties : IObjectProperties + public class ObjectProperties : IObjectProperties, IDisposable { private readonly Observer refreshRequiredObserver; Index: Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyGridViewTest.cs =================================================================== diff -u -raf8fe0bbc3b765d4361edc18f3e1ebb79141f4b5 -r1ab3d180b9a6ea55959a33564b11bea9a10db3c8 --- Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyGridViewTest.cs (.../PropertyGridViewTest.cs) (revision af8fe0bbc3b765d4361edc18f3e1ebb79141f4b5) +++ Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyGridViewTest.cs (.../PropertyGridViewTest.cs) (revision 1ab3d180b9a6ea55959a33564b11bea9a10db3c8) @@ -65,6 +65,7 @@ Assert.AreEqual("Gecategoriseerd", toolStrip.Items[0].ToolTipText); Assert.AreEqual("Alfabetisch", toolStrip.Items[1].ToolTipText); } + mockRepository.VerifyAll(); } @@ -93,6 +94,7 @@ Assert.IsFalse(toolStrip.Items[3].Visible); Assert.IsFalse(toolStrip.Items[4].Visible); } + mockRepository.VerifyAll(); } @@ -121,6 +123,7 @@ Assert.AreSame(selectedObject, propertyGridView.SelectedObject); Assert.AreEqual(0, propertyGridView.RefreshCalled); } + mockRepository.VerifyAll(); } @@ -148,10 +151,67 @@ Assert.AreSame(selectedObject, propertyGridView.SelectedObject); Assert.AreEqual(0, propertyGridView.RefreshCalled); } + mockRepository.VerifyAll(); } [Test] + public void Data_SetNewDataObject_PreviousDataDisposed() + { + // Setup + var mockRepository = new MockRepository(); + var dataObject = new object(); + object dataObjectProperties = mockRepository.StrictMultiMock(typeof(IDisposable), typeof(IObjectProperties)); + dataObjectProperties.Expect(d => ((IDisposable) d).Dispose()); + dataObjectProperties.Stub(d => ((IObjectProperties) d).RefreshRequired += null).IgnoreArguments(); + dataObjectProperties.Stub(d => ((IObjectProperties) d).RefreshRequired -= null).IgnoreArguments(); + + var newDataObject = new object(); + var propertyResolver = mockRepository.StrictMock(); + propertyResolver.Expect(prs => prs.GetObjectProperties(dataObject)).Return(new DynamicPropertyBag(dataObjectProperties)); + propertyResolver.Expect(prs => prs.GetObjectProperties(newDataObject)).Return(null); + mockRepository.ReplayAll(); + + using (var propertyGridView = new TestGuiPropertyGridView(propertyResolver)) + { + propertyGridView.Data = dataObject; + + // Call + propertyGridView.Data = newDataObject; + } + + // Assert + mockRepository.VerifyAll(); + } + + [Test] + public void GivenPropertyGridViewWithDisposableDataSet_WhenDisposing_ThenObjectPropertiesCorrectlyDisposed() + { + // Given + var mockRepository = new MockRepository(); + var dataObject = new object(); + object dataObjectProperties = mockRepository.StrictMultiMock(typeof(IDisposable), typeof(IObjectProperties)); + dataObjectProperties.Expect(d => ((IDisposable) d).Dispose()); + dataObjectProperties.Stub(d => ((IObjectProperties) d).RefreshRequired += null).IgnoreArguments(); + dataObjectProperties.Stub(d => ((IObjectProperties) d).RefreshRequired -= null).IgnoreArguments(); + + var propertyResolver = mockRepository.StrictMock(); + propertyResolver.Expect(prs => prs.GetObjectProperties(dataObject)).Return(new DynamicPropertyBag(dataObjectProperties)); + mockRepository.ReplayAll(); + + var propertyGridView = new TestGuiPropertyGridView(propertyResolver) + { + Data = dataObject + }; + + // When + propertyGridView.Dispose(); + + // Then + mockRepository.VerifyAll(); + } + + [Test] public void GivenPropertyGridViewWithDataSet_WhenRefreshRequiredEventRaised_ThenRefreshTriggered() { // Given @@ -176,6 +236,7 @@ // Then Assert.AreEqual(1, propertyGridView.RefreshCalled); } + mockRepository.VerifyAll(); } @@ -238,6 +299,7 @@ // Then Assert.AreEqual(1, propertyGridView.RefreshCalled); } + mockRepository.VerifyAll(); } @@ -271,6 +333,7 @@ // Then Assert.AreEqual(0, propertyGridView.RefreshCalled); } + mockRepository.VerifyAll(); }