From 947598fcec9d492831016b813fca538fd8246d4b Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 9 Aug 2019 14:52:32 +0200 Subject: [PATCH] More tests forContentPresenter and InheritanceParent. Make sure the inheritance parent is reset for non-rooted and standalone `ContentPresenter`s. --- .../Presenters/ContentPresenter.cs | 7 ++++++- .../ContentPresenterTests_Standalone.cs | 16 ++++++++++++++++ .../ContentPresenterTests_Unrooted.cs | 17 +++++++++++++++++ 3 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/Avalonia.Controls/Presenters/ContentPresenter.cs b/src/Avalonia.Controls/Presenters/ContentPresenter.cs index c2690d503d..1072b21b1b 100644 --- a/src/Avalonia.Controls/Presenters/ContentPresenter.cs +++ b/src/Avalonia.Controls/Presenters/ContentPresenter.cs @@ -237,7 +237,7 @@ namespace Avalonia.Controls.Presenters // template. LogicalChildren.Remove(oldChild); } - else + else if (TemplatedParent != null) { // If we're in a ContentControl's template then invoke ChildChanging to let // ContentControlMixin handle removing the logical child. @@ -248,6 +248,10 @@ namespace Avalonia.Controls.Presenters newChild, BindingPriority.LocalValue)); } + else if (oldChild != null) + { + ((ISetInheritanceParent)oldChild).SetParent(oldChild.Parent); + } } // Set the DataContext if the data isn't a control. @@ -433,6 +437,7 @@ namespace Avalonia.Controls.Presenters { VisualChildren.Remove(Child); LogicalChildren.Remove(Child); + ((ISetInheritanceParent)Child).SetParent(Child.Parent); Child = null; _dataTemplate = null; } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs index ab75a87110..59f3ae44c2 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs @@ -251,5 +251,21 @@ namespace Avalonia.Controls.UnitTests.Presenters target.Content = 42; } + + [Fact] + public void Should_Reset_InheritanceParent_When_Child_Removed() + { + var logicalParent = new Canvas(); + var child = new TextBlock(); + var target = new ContentPresenter(); + var root = new TestRoot(target); + + ((ISetLogicalParent)child).SetParent(logicalParent); + target.Content = child; + target.Content = null; + + // InheritanceParent is exposed via StylingParent. + Assert.Same(logicalParent, ((IStyledElement)child).StylingParent); + } } } diff --git a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Unrooted.cs b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Unrooted.cs index 09970926fa..c30e81a1cb 100644 --- a/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Unrooted.cs +++ b/tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Unrooted.cs @@ -98,5 +98,22 @@ namespace Avalonia.Controls.UnitTests.Presenters target.ApplyTemplate(); Assert.IsType(target.Child); } + + [Fact] + public void Should_Reset_InheritanceParent_When_Child_Removed() + { + var logicalParent = new Canvas(); + var child = new TextBlock(); + var target = new ContentPresenter(); + + ((ISetLogicalParent)child).SetParent(logicalParent); + target.Content = child; + target.UpdateChild(); + target.Content = null; + target.UpdateChild(); + + // InheritanceParent is exposed via StylingParent. + Assert.Same(logicalParent, ((IStyledElement)child).StylingParent); + } } }