Index: Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.Designer.cs =================================================================== diff -u -ra588770d1c9fd051a0aa84c5b381ecd6238db9a7 -r290fcfde155c13a1e87a3e9230bbde7e63ab0476 --- Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.Designer.cs (.../ScenariosView.Designer.cs) (revision a588770d1c9fd051a0aa84c5b381ecd6238db9a7) +++ Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.Designer.cs (.../ScenariosView.Designer.cs) (revision 290fcfde155c13a1e87a3e9230bbde7e63ab0476) @@ -21,7 +21,7 @@ namespace Riskeer.Common.Forms.Views { - partial class ScenariosView + partial class ScenariosView { /// /// Required designer variable. Index: Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.cs =================================================================== diff -u -ra7edac6e409e6f2bab9e784261cd59ece1a2a660 -r290fcfde155c13a1e87a3e9230bbde7e63ab0476 --- Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.cs (.../ScenariosView.cs) (revision a7edac6e409e6f2bab9e784261cd59ece1a2a660) +++ Riskeer/Common/src/Riskeer.Common.Forms/Views/ScenariosView.cs (.../ScenariosView.cs) (revision 290fcfde155c13a1e87a3e9230bbde7e63ab0476) @@ -36,21 +36,24 @@ /// Base view for configuration calculation scenarios. /// /// The type of calculation scenario. + /// The type of calculation input. /// The type of the scenario row. - public abstract partial class ScenariosView : UserControl, IView + public abstract partial class ScenariosView : UserControl, IView where TCalculationScenario : class, ICalculationScenario + where TCalculationInput : class, ICalculationInput where TScenarioRow : ScenarioRow { private readonly IFailureMechanism failureMechanism; private readonly Observer failureMechanismObserver; private readonly RecursiveObserver calculationGroupObserver; private readonly RecursiveObserver calculationObserver; - + private readonly RecursiveObserver calculationInputObserver; + private IEnumerable scenarioRows; /// - /// Creates a new instance of . + /// Creates a new instance of . /// /// The /// to get the calculations from. @@ -89,6 +92,14 @@ Observable = calculationGroup }; + // The concat is needed to observe the input of calculations in child groups. + calculationInputObserver = new RecursiveObserver(UpdateDataGridViewDataSource, pcg => pcg.Children.Concat( + pcg.Children.OfType() + .Select(GetCalculationInput))) + { + Observable = calculationGroup + }; + InitializeComponent(); InitializeListBox(); @@ -105,6 +116,13 @@ protected CalculationGroup CalculationGroup { get; } /// + /// Gets the input of a . + /// + /// The to get the input from. + /// The . + protected abstract TCalculationInput GetCalculationInput(TCalculationScenario calculationScenario); + + /// /// Gets a collection of . /// /// The collection of . @@ -115,6 +133,7 @@ failureMechanismObserver.Dispose(); calculationGroupObserver.Dispose(); calculationObserver.Dispose(); + calculationInputObserver.Dispose(); if (disposing) { Index: Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs =================================================================== diff -u -ra7edac6e409e6f2bab9e784261cd59ece1a2a660 -r290fcfde155c13a1e87a3e9230bbde7e63ab0476 --- Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs (.../ScenariosViewTest.cs) (revision a7edac6e409e6f2bab9e784261cd59ece1a2a660) +++ Riskeer/Common/test/Riskeer.Common.Forms.Test/Views/ScenariosViewTest.cs (.../ScenariosViewTest.cs) (revision 290fcfde155c13a1e87a3e9230bbde7e63ab0476) @@ -369,6 +369,34 @@ Assert.IsTrue(scenarioRows.All(row => row.Updated)); } + [Test] + public void GivenScenarioView_WhenCalculationInputNotifiesObserver_ThenDataGridViewUpdated() + { + // Given + var calculationGroup = new CalculationGroup(); + ShowFullyConfiguredScenarioView(calculationGroup, new TestFailureMechanism()); + + var dataGridView = (DataGridView) new ControlTester("dataGridView").TheObject; + + TestScenarioRow[] sectionResultRows = dataGridView.Rows.Cast() + .Select(r => r.DataBoundItem) + .Cast() + .ToArray(); + + TestCalculationScenario calculation = calculationGroup.GetCalculations().Cast().First(); + + // When + calculation.InputParameters.NotifyObservers(); + + // Then + TestScenarioRow[] updatedRows = dataGridView.Rows.Cast() + .Select(r => r.DataBoundItem) + .Cast() + .ToArray(); + + CollectionAssert.AreNotEquivalent(sectionResultRows, updatedRows); + } + private void ShowFullyConfiguredScenarioView(CalculationGroup calculationGroup, IFailureMechanism failureMechanism) { FailureMechanismTestHelper.SetSections(failureMechanism, new[] @@ -409,13 +437,18 @@ testForm.Show(); } - private class TestScenariosView : ScenariosView + private class TestScenariosView : ScenariosView { public TestScenariosView(CalculationGroup calculationGroup, IFailureMechanism failureMechanism) : base(calculationGroup, failureMechanism) {} public CalculationGroup TestCalculationGroup => CalculationGroup; + protected override TestCalculationInput GetCalculationInput(TestCalculationScenario calculationScenario) + { + return calculationScenario.InputParameters; + } + protected override IEnumerable GetScenarioRows() { return CalculationGroup.Children.OfType() @@ -430,7 +463,7 @@ : base(calculationScenario) {} public override string FailureProbability => "1"; - + public bool Updated { get; private set; } public override void Update()