Index: Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs =================================================================== diff -u -rb389b4d34dab98838a8c2f087b18cfdac544f01f -r3dc8c84f97530f446f2a53d231e8683e105f58e6 --- Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs (.../PipingCalculationsView.cs) (revision b389b4d34dab98838a8c2f087b18cfdac544f01f) +++ Ringtoets/Piping/src/Ringtoets.Piping.Forms/Views/PipingCalculationsView.cs (.../PipingCalculationsView.cs) (revision 3dc8c84f97530f446f2a53d231e8683e105f58e6) @@ -19,9 +19,11 @@ // Stichting Deltares and remain full property of Stichting Deltares at all times. // All rights reserved. +using System; using System.Collections.Generic; using System.Linq; using System.Windows.Forms; +using Core.Common.Base; using Core.Common.Base.Data; using Core.Common.Controls.DataGrid; using Core.Common.Controls.Views; @@ -43,6 +45,7 @@ private PipingCalculationGroup pipingCalculationGroup; private DataGridViewComboBoxColumn soilProfileColumn; private DataGridViewComboBoxColumn hydraulicBoundaryLocationColumn; + private readonly DynamicObserver pipingCalculationGroupObserver; /// /// Creates a new instance of the class. @@ -51,24 +54,8 @@ { InitializeComponent(); InitializeDataGridView(); - } - public object Data - { - get - { - return pipingCalculationGroup; - } - set - { - pipingCalculationGroup = value as PipingCalculationGroup; - - dataGridView.DataSource = pipingCalculationGroup != null - ? pipingCalculationGroup.GetPipingCalculations() - .Select(pc => new PipingCalculationRow(pc)) - .ToList() - : null; - } + pipingCalculationGroupObserver = new DynamicObserver(UpdateDataGridViewDataSource); } /// @@ -111,6 +98,29 @@ } } + public object Data + { + get + { + return pipingCalculationGroup; + } + set + { + pipingCalculationGroup = value as PipingCalculationGroup; + + if (pipingCalculationGroup != null) + { + UpdateDataGridViewDataSource(); + pipingCalculationGroupObserver.Observable = pipingCalculationGroup; + } + else + { + dataGridView.DataSource = null; + pipingCalculationGroupObserver.Observable = null; + } + } + } + private void InitializeDataGridView() { var nameColumn = new DataGridViewTextBoxColumn @@ -179,6 +189,13 @@ dataGridView.Columns.AddRange(nameColumn, soilProfileColumn, hydraulicBoundaryLocationColumn, dampingFactorExitMeanColumn, phreaticLevelExitMeanColumn, entryPointLColumn, exitPointLColumn); } + private void UpdateDataGridViewDataSource() + { + dataGridView.DataSource = pipingCalculationGroup.GetPipingCalculations() + .Select(pc => new PipingCalculationRow(pc)) + .ToList(); + } + private static List> GetSoilProfilesDataSource(IEnumerable soilProfiles = null) { var dataGridViewComboBoxItemWrappers = new List> @@ -209,6 +226,46 @@ return dataGridViewComboBoxItemWrappers; } + #region Nested types + + private class DynamicObserver : IObserver + { + private readonly Action updateObserverAction; + private IObservable observable; + + public DynamicObserver(Action updateObserverAction) + { + this.updateObserverAction = updateObserverAction; + } + + public IObservable Observable + { + get + { + return observable; + } + set + { + if (observable != null) + { + observable.Detach(this); + } + + observable = value; + + if (observable != null) + { + observable.Attach(this); + } + } + } + + public void UpdateObserver() + { + updateObserverAction(); + } + } + private class PipingCalculationRow { private readonly PipingCalculation pipingCalculation; @@ -302,5 +359,7 @@ } } } + + #endregion } } \ No newline at end of file