diff --git a/src/Controls/src/Core/Layout/Grid.cs b/src/Controls/src/Core/Layout/Grid.cs index b8208249dcc2..d8c8855bbd24 100644 --- a/src/Controls/src/Core/Layout/Grid.cs +++ b/src/Controls/src/Core/Layout/Grid.cs @@ -369,6 +369,8 @@ void DefinitionsChanged(object sender, EventArgs args) _rowDefs = null; _colDefs = null; + UpdateRowColumnBindingContexts(); + InvalidateMeasure(); } @@ -378,6 +380,29 @@ protected override void InvalidateMeasure() (this as IView)?.InvalidateMeasure(); } + protected override void OnBindingContextChanged() + { + base.OnBindingContextChanged(); + UpdateRowColumnBindingContexts(); + } + + void UpdateRowColumnBindingContexts() + { + var bindingContext = BindingContext; + + RowDefinitionCollection rowDefs = RowDefinitions; + for (var i = 0; i < rowDefs.Count; i++) + { + SetInheritedBindingContext(rowDefs[i], bindingContext); + } + + ColumnDefinitionCollection colDefs = ColumnDefinitions; + for (var i = 0; i < colDefs.Count; i++) + { + SetInheritedBindingContext(colDefs[i], bindingContext); + } + } + class GridInfo { public int Row { get; set; } diff --git a/src/Controls/tests/Core.UnitTests/Layouts/GridLayoutTests.cs b/src/Controls/tests/Core.UnitTests/Layouts/GridLayoutTests.cs index eccde4c69d7f..836ad9311059 100644 --- a/src/Controls/tests/Core.UnitTests/Layouts/GridLayoutTests.cs +++ b/src/Controls/tests/Core.UnitTests/Layouts/GridLayoutTests.cs @@ -128,5 +128,61 @@ static void AssertInvalidated(IViewHandler handler) { handler.Received().Invoke(Arg.Is(nameof(IView.InvalidateMeasure)), Arg.Any()); } + + [Test] + public void RowDefinitionsGetBindingContext() + { + var def = new RowDefinition(); + var def2 = new RowDefinition(); + + var grid = new Grid() + { + RowDefinitions = new RowDefinitionCollection + { + def + } + }; + + var context = new object(); + + Assert.That(def.BindingContext, Is.Null); + Assert.That(def2.BindingContext, Is.Null); + + grid.BindingContext = context; + + Assert.That(def.BindingContext, Is.EqualTo(context)); + + grid.RowDefinitions.Add(def2); + + Assert.That(def2.BindingContext, Is.EqualTo(context)); + } + + [Test] + public void ColumnDefinitionsGetBindingContext() + { + var def = new ColumnDefinition(); + var def2 = new ColumnDefinition(); + + var grid = new Grid() + { + ColumnDefinitions = new ColumnDefinitionCollection + { + def + } + }; + + var context = new object(); + + Assert.That(def.BindingContext, Is.Null); + Assert.That(def2.BindingContext, Is.Null); + + grid.BindingContext = context; + + Assert.That(def.BindingContext, Is.EqualTo(context)); + + grid.ColumnDefinitions.Add(def2); + + Assert.That(def2.BindingContext, Is.EqualTo(context)); + } } }