From 3113198179af4789ea7c02e932f6a17d778169c2 Mon Sep 17 00:00:00 2001 From: Christopher Dresel Date: Fri, 5 Jul 2019 20:29:42 +0200 Subject: [PATCH] Fix for #6444: Propagate binding context for children of shell sections (#6730) * Propagate binding context for children of shell sections * Added a few more BindingContext Propagation tests --- Xamarin.Forms.Core.UnitTests/ShellTests.cs | 98 ++++++++++++++++++++++++++++++ Xamarin.Forms.Core/Shell/ShellSection.cs | 11 +++- 2 files changed, 108 insertions(+), 1 deletion(-) diff --git a/Xamarin.Forms.Core.UnitTests/ShellTests.cs b/Xamarin.Forms.Core.UnitTests/ShellTests.cs index 81c4a25..6ff189d 100644 --- a/Xamarin.Forms.Core.UnitTests/ShellTests.cs +++ b/Xamarin.Forms.Core.UnitTests/ShellTests.cs @@ -33,6 +33,104 @@ namespace Xamarin.Forms.Core.UnitTests } [Test] + public void ShellChildrenBindingContext() + { + var shell = new Shell(); + + var shellItem = CreateShellItem(); + shell.Items.Add(shellItem); + + object viewModel = new object(); + shell.BindingContext = viewModel; + + Assert.AreSame(shell.BindingContext, viewModel); + Assert.AreSame(shellItem.BindingContext, viewModel); + Assert.AreSame(shellItem.Items[0].BindingContext, viewModel); + Assert.AreSame(shellItem.Items[0].Items[0].BindingContext, viewModel); + Assert.AreSame((shellItem.Items[0].Items[0].Content as BindableObject).BindingContext, viewModel); + } + + [Test] + public void ShellPropagateBindingContextWhenAddingNewShellItem() + { + var shell = new Shell(); + + shell.Items.Add(CreateShellItem()); + + object viewModel = new object(); + shell.BindingContext = viewModel; + var shellItem = CreateShellItem(); + shell.Items.Add(shellItem); + + Assert.AreSame(shellItem.BindingContext, viewModel); + Assert.AreSame(shellItem.Items[0].BindingContext, viewModel); + Assert.AreSame(shellItem.Items[0].Items[0].BindingContext, viewModel); + Assert.AreSame((shellItem.Items[0].Items[0].Content as BindableObject).BindingContext, viewModel); + } + + [Test] + public void ShellPropagateBindingContextWhenAddingNewShellSection() + { + var shell = new Shell(); + + shell.Items.Add(CreateShellItem()); + + object viewModel = new object(); + shell.BindingContext = viewModel; + var shellSection = CreateShellSection(); + shell.Items[0].Items.Add(shellSection); + + Assert.AreSame(shellSection.BindingContext, viewModel); + Assert.AreSame(shellSection.Items[0].BindingContext, viewModel); + Assert.AreSame((shellSection.Items[0].Content as BindableObject).BindingContext, viewModel); + } + + [Test] + public void ShellPropagateBindingContextWhenAddingNewShellContent() + { + var shell = new Shell(); + + shell.Items.Add(CreateShellItem()); + + object viewModel = new object(); + shell.BindingContext = viewModel; + var shellContent = CreateShellContent(); + shell.Items[0].Items[0].Items.Add(shellContent); + + Assert.AreSame(shellContent.BindingContext, viewModel); + Assert.AreSame((shellContent.Content as BindableObject).BindingContext, viewModel); + } + + [Test] + public void ShellPropagateBindingContextWhenChangingContent() + { + var shell = new Shell(); + + shell.Items.Add(CreateShellItem()); + + object viewModel = new object(); + shell.BindingContext = viewModel; + var contentPage = new ContentPage(); + + shell.Items[0].Items[0].Items[0].Content = contentPage; + Assert.AreSame(contentPage.BindingContext, viewModel); + } + + [Test] + public async Task ShellPropagateBindingContextWhenPushingContent() + { + var shell = new Shell(); + shell.Items.Add(CreateShellItem()); + + object viewModel = new object(); + shell.BindingContext = viewModel; + var contentPage = new ContentPage(); + await shell.Navigation.PushAsync(contentPage); + + Assert.AreSame(contentPage.BindingContext, viewModel); + } + + [Test] public void NavigationProxyWireUpTest() { var page = new ContentPage(); diff --git a/Xamarin.Forms.Core/Shell/ShellSection.cs b/Xamarin.Forms.Core/Shell/ShellSection.cs index fdc4a2d..d3c5027 100644 --- a/Xamarin.Forms.Core/Shell/ShellSection.cs +++ b/Xamarin.Forms.Core/Shell/ShellSection.cs @@ -598,11 +598,20 @@ namespace Xamarin.Forms } } + protected override void OnBindingContextChanged() + { + base.OnBindingContextChanged(); + + foreach (ShellContent shellContent in Items) + { + SetInheritedBindingContext(shellContent, BindingContext); + } + } + internal override void SendDisappearing() { base.SendDisappearing(); PresentedPageDisappearing(); - } internal override void SendAppearing() -- 2.7.4