Index: Core/Common/src/Core.Common.Gui/Forms/PropertyGridView/PropertyGridView.cs
===================================================================
diff -u -r6b8f6422c0a6f96f8e563bb6afb82a7a192142b4 -re217c241d1d57575c99e1062b449ea595f9fc764
--- Core/Common/src/Core.Common.Gui/Forms/PropertyGridView/PropertyGridView.cs (.../PropertyGridView.cs) (revision 6b8f6422c0a6f96f8e563bb6afb82a7a192142b4)
+++ Core/Common/src/Core.Common.Gui/Forms/PropertyGridView/PropertyGridView.cs (.../PropertyGridView.cs) (revision e217c241d1d57575c99e1062b449ea595f9fc764)
@@ -25,7 +25,6 @@
using System.Reflection;
using System.Security.Permissions;
using System.Windows.Forms;
-using Core.Common.Base;
using Core.Common.Controls.Views;
using Core.Common.Gui.Properties;
using Core.Common.Gui.PropertyBag;
@@ -35,11 +34,12 @@
///
/// View for displaying the properties of an data object.
///
- public class PropertyGridView : PropertyGrid, IView, IObserver
+ public class PropertyGridView : PropertyGrid, IView
{
private readonly IPropertyResolver propertyResolver;
+
private object data;
- private IObservable observable;
+ private IObjectProperties objectProperties;
///
/// This delegate enabled asynchronous calls to methods without arguments.
@@ -68,19 +68,6 @@
this.propertyResolver = propertyResolver;
}
- public void UpdateObserver()
- {
- if (InvokeRequired)
- {
- ArgumentlessDelegate d = UpdateObserver;
- Invoke(d, new object[0]);
- }
- else
- {
- Refresh();
- }
- }
-
protected override void OnPropertySortChanged(EventArgs e)
{
// Needed for maintaining property order (no support for both categorized and alphabetical sorting)
@@ -94,11 +81,24 @@
protected override void Dispose(bool disposing)
{
- observable?.Detach(this);
+ DisposeObjectProperties();
base.Dispose(disposing);
}
+ private void RefreshPropertyGridView()
+ {
+ if (InvokeRequired)
+ {
+ ArgumentlessDelegate d = RefreshPropertyGridView;
+ Invoke(d, new object[0]);
+ }
+ else
+ {
+ Refresh();
+ }
+ }
+
#region IView Members
public object Data
@@ -115,33 +115,34 @@
return;
}
- DetachObservable();
+ DisposeObjectProperties();
data = value;
- AttachObservable();
+
+ SelectedObject = GetObjectProperties(data);
+
+ var dynamicPropertyBag = SelectedObject as DynamicPropertyBag;
+ objectProperties = dynamicPropertyBag?.WrappedObject as IObjectProperties;
+
+ if (objectProperties != null)
+ {
+ objectProperties.RefreshRequired += HandleRefreshRequired;
+ }
}
}
- private void DetachObservable()
+ private void DisposeObjectProperties()
{
- if (observable != null)
+ if (objectProperties != null)
{
- observable.Detach(this);
- observable = null;
+ objectProperties.RefreshRequired -= HandleRefreshRequired;
+ objectProperties.Dispose();
}
}
- private void AttachObservable()
+ private void HandleRefreshRequired(object sender, EventArgs e)
{
- SelectedObject = GetObjectProperties(data);
-
- var dynamicPropertyBag = SelectedObject as DynamicPropertyBag;
- var objectProperties = dynamicPropertyBag?.WrappedObject as IObjectProperties;
- if (objectProperties != null)
- {
- observable = objectProperties.Data as IObservable;
- observable?.Attach(this);
- }
+ RefreshPropertyGridView();
}
private object GetObjectProperties(object sourceData)
Index: Core/Common/src/Core.Common.Gui/PropertyBag/IObjectProperties.cs
===================================================================
diff -u -r67284323e2785c651633d9c52049ba12a9c70e6a -re217c241d1d57575c99e1062b449ea595f9fc764
--- Core/Common/src/Core.Common.Gui/PropertyBag/IObjectProperties.cs (.../IObjectProperties.cs) (revision 67284323e2785c651633d9c52049ba12a9c70e6a)
+++ Core/Common/src/Core.Common.Gui/PropertyBag/IObjectProperties.cs (.../IObjectProperties.cs) (revision e217c241d1d57575c99e1062b449ea595f9fc764)
@@ -19,16 +19,23 @@
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
+using System;
+
namespace Core.Common.Gui.PropertyBag
{
///
/// Interface for object properties.
///
- public interface IObjectProperties
+ public interface IObjectProperties : IDisposable
{
///
/// Gets or sets the data of the object properties.
///
object Data { get; set; }
+
+ ///
+ /// Fired when the property grid should be refreshed.
+ ///
+ event EventHandler RefreshRequired;
}
}
\ No newline at end of file
Index: Core/Common/src/Core.Common.Gui/PropertyBag/ObjectProperties.cs
===================================================================
diff -u -r67284323e2785c651633d9c52049ba12a9c70e6a -re217c241d1d57575c99e1062b449ea595f9fc764
--- Core/Common/src/Core.Common.Gui/PropertyBag/ObjectProperties.cs (.../ObjectProperties.cs) (revision 67284323e2785c651633d9c52049ba12a9c70e6a)
+++ Core/Common/src/Core.Common.Gui/PropertyBag/ObjectProperties.cs (.../ObjectProperties.cs) (revision e217c241d1d57575c99e1062b449ea595f9fc764)
@@ -19,7 +19,9 @@
// Stichting Deltares and remain full property of Stichting Deltares at all times.
// All rights reserved.
+using System;
using System.ComponentModel;
+using Core.Common.Base;
namespace Core.Common.Gui.PropertyBag
{
@@ -29,8 +31,20 @@
/// Type of .
public class ObjectProperties : IObjectProperties
{
+ private readonly Observer refreshRequiredObserver;
+
protected T data;
+ public event EventHandler RefreshRequired;
+
+ ///
+ /// Creates a new instance of .
+ ///
+ public ObjectProperties()
+ {
+ refreshRequiredObserver = new Observer(OnRefreshRequired);
+ }
+
[Browsable(false)]
public object Data
{
@@ -41,7 +55,19 @@
set
{
data = (T) value;
+
+ refreshRequiredObserver.Observable = value as IObservable;
}
}
+
+ public void Dispose()
+ {
+ refreshRequiredObserver?.Dispose();
+ }
+
+ private void OnRefreshRequired()
+ {
+ RefreshRequired?.Invoke(this, new EventArgs());
+ }
}
}
\ No newline at end of file
Index: Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyGridViewTest.cs
===================================================================
diff -u -r1bbf51443c907b5f202e80764fa05f2e7f842c04 -re217c241d1d57575c99e1062b449ea595f9fc764
--- Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyGridViewTest.cs (.../PropertyGridViewTest.cs) (revision 1bbf51443c907b5f202e80764fa05f2e7f842c04)
+++ Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyGridViewTest.cs (.../PropertyGridViewTest.cs) (revision e217c241d1d57575c99e1062b449ea595f9fc764)
@@ -22,7 +22,6 @@
using System;
using System.Linq;
using System.Windows.Forms;
-using Core.Common.Base;
using Core.Common.Controls.Views;
using Core.Common.Gui.Forms.PropertyGridView;
using Core.Common.Gui.PropertyBag;
@@ -58,7 +57,6 @@
// Assert
Assert.IsInstanceOf(propertyGridView);
Assert.IsInstanceOf(propertyGridView);
- Assert.IsInstanceOf(propertyGridView);
Assert.IsNull(propertyGridView.Data);
Assert.AreEqual(PropertySort.Categorized, propertyGridView.PropertySort);
@@ -153,27 +151,28 @@
}
[Test]
- public void GivenPropertyGridViewWithObservableSet_WhenNotifyObserverCalled_ThenRefreshTriggered()
+ public void GivenPropertyGridViewWithObservableSet_WhenRefreshRequiredEventRaised_ThenRefreshTriggered()
{
// Given
var dataObject = new object();
- var observerable = new SimpleObservable();
var mockRepository = new MockRepository();
var objectProperties = mockRepository.Stub();
- objectProperties.Data = observerable;
-
var propertyResolver = mockRepository.StrictMock();
propertyResolver.Expect(prs => prs.GetObjectProperties(dataObject)).Return(new DynamicPropertyBag(objectProperties));
mockRepository.ReplayAll();
- using (var propertyGridView = new TestGuiPropertyGridView(propertyResolver))
+ using (var propertyGridView = new TestGuiPropertyGridView(propertyResolver)
{
+ Data = dataObject
+ })
+ {
// When
- propertyGridView.Data = dataObject;
+ objectProperties.Raise(p => p.RefreshRequired += null,
+ objectProperties,
+ EventArgs.Empty);
// Then
- observerable.NotifyObservers();
Assert.AreEqual(1, propertyGridView.RefreshCalled);
}
mockRepository.VerifyAll();
@@ -213,7 +212,5 @@
base.Refresh();
}
}
-
- private class SimpleObservable : Observable {}
}
}
\ No newline at end of file
Index: Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyResolverTest.cs
===================================================================
diff -u -r67284323e2785c651633d9c52049ba12a9c70e6a -re217c241d1d57575c99e1062b449ea595f9fc764
--- Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyResolverTest.cs (.../PropertyResolverTest.cs) (revision 67284323e2785c651633d9c52049ba12a9c70e6a)
+++ Core/Common/test/Core.Common.Gui.Test/Forms/PropertyGridView/PropertyResolverTest.cs (.../PropertyResolverTest.cs) (revision e217c241d1d57575c99e1062b449ea595f9fc764)
@@ -243,15 +243,9 @@
private class A {}
- private class PropertiesForA : IObjectProperties
- {
- public object Data { get; set; }
- }
+ private class PropertiesForA : ObjectProperties