diff --git a/src/Controls/src/Core/ContentView/ContentView.cs b/src/Controls/src/Core/ContentView/ContentView.cs index b447cabdc1f4..cea011330a50 100644 --- a/src/Controls/src/Core/ContentView/ContentView.cs +++ b/src/Controls/src/Core/ContentView/ContentView.cs @@ -22,31 +22,27 @@ protected override void OnBindingContextChanged() { base.OnBindingContextChanged(); - IView content = Content; - - if (content == null && (this as IContentView)?.PresentedContent is IView presentedContent) - content = presentedContent; - - ControlTemplate controlTemplate = ControlTemplate; - - if (content is BindableObject bindableContent && controlTemplate != null) - SetInheritedBindingContext(bindableContent, BindingContext); + if (Content is View content) + { + SetInheritedBindingContext(content, BindingContext); + } } internal override void OnControlTemplateChanged(ControlTemplate oldValue, ControlTemplate newValue) { - if (oldValue == null) - return; - base.OnControlTemplateChanged(oldValue, newValue); - View content = Content; - ControlTemplate controlTemplate = ControlTemplate; - if (content != null && controlTemplate != null) + + if (Content is View content) { SetInheritedBindingContext(content, BindingContext); } } + internal override void SetChildInheritedBindingContext(Element child, object context) + { + SetInheritedBindingContext(child, context); + } + object IContentView.Content => Content; IView IContentView.PresentedContent => ((this as IControlTemplated).TemplateRoot as IView) ?? Content; diff --git a/src/Controls/tests/Core.UnitTests/ContentViewUnitTest.cs b/src/Controls/tests/Core.UnitTests/ContentViewUnitTest.cs index 1a79a5bfacc6..7f9ff7e5472f 100644 --- a/src/Controls/tests/Core.UnitTests/ContentViewUnitTest.cs +++ b/src/Controls/tests/Core.UnitTests/ContentViewUnitTest.cs @@ -315,7 +315,7 @@ public void PacksContent() } [Fact] - public void DoesNotInheritBindingContextToTemplate() + public void DoesInheritBindingContextToTemplate() { var contentView = new ContentView(); var child = new View(); @@ -326,8 +326,38 @@ public void DoesNotInheritBindingContextToTemplate() var bc = "Test"; contentView.BindingContext = bc; - Assert.NotEqual(bc, ((IElementController)contentView).LogicalChildren[0].BindingContext); - Assert.Null(((IElementController)contentView).LogicalChildren[0].BindingContext); + Assert.Equal(bc, ((IElementController)contentView).LogicalChildren[0].BindingContext); + } + + [Fact] + public void DoesNotInheritBindingContextToContentFromControlTemplate() + { + var contentView = new ContentView(); + var child1 = new View(); + var child2 = new View(); + + contentView.ControlTemplate = new ControlTemplate(typeof(SimpleTemplate)); + contentView.Content = child1; + + var bcContentView = "Test"; + var bcSimpleTemplate = "other context"; + contentView.BindingContext = bcContentView; + + var simpleTemplate = contentView.GetVisualTreeDescendants().OfType().Single(); + var cp = contentView.GetVisualTreeDescendants().OfType().Single(); + simpleTemplate.BindingContext = bcSimpleTemplate; + + Assert.Equal(bcContentView, child1.BindingContext); + Assert.Equal(contentView.BindingContext, child1.BindingContext); + Assert.Equal(bcSimpleTemplate, simpleTemplate.BindingContext); + + // Change out content and make sure simple templates BC doesn't propagate + contentView.Content = child2; + + Assert.Equal(bcContentView, child2.BindingContext); + Assert.Equal(contentView.BindingContext, child2.BindingContext); + Assert.Equal(bcSimpleTemplate, simpleTemplate.BindingContext); + Assert.Equal(bcSimpleTemplate, cp.BindingContext); } [Fact] @@ -346,7 +376,7 @@ public void ContentDoesGetBindingContext() } [Fact] - public void ContentParentIsNotInsideTempalte() + public void ContentParentIsNotInsideTemplate() { var contentView = new ContentView(); var child = new View(); @@ -384,5 +414,31 @@ public void ContentView_should_have_the_InternalChildren_correctly_when_Content_ Assert.Single(internalChildren); Assert.Same(expected, internalChildren[0]); } + + + [Fact] + public void BindingContextNotLostWhenSwitchingTemplates() + { + var bc = new object(); + var contentView = new ContentView() + { + BindingContext = bc + }; + + + contentView.ControlTemplate = new ControlTemplate(typeof(SimpleTemplate)); + + var simpleTemplate1 = contentView.GetVisualTreeDescendants().OfType().Single(); + contentView.Content = new Label(); + + Assert.Same(bc, simpleTemplate1.BindingContext); + + contentView.ControlTemplate = new ControlTemplate(typeof(SimpleTemplate)); + + var simpleTemplate2 = contentView.GetVisualTreeDescendants().OfType().Single(); + + Assert.NotSame(simpleTemplate1, simpleTemplate2); + Assert.Same(bc, simpleTemplate2.BindingContext); + } } }