Browse Source

More tests forContentPresenter and InheritanceParent.

Make sure the inheritance parent is reset for non-rooted and standalone `ContentPresenter`s.
pull/2825/head
Steven Kirk 7 years ago
parent
commit
947598fcec
  1. 7
      src/Avalonia.Controls/Presenters/ContentPresenter.cs
  2. 16
      tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Standalone.cs
  3. 17
      tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Unrooted.cs

7
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;
}

16
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);
}
}
}

17
tests/Avalonia.Controls.UnitTests/Presenters/ContentPresenterTests_Unrooted.cs

@ -98,5 +98,22 @@ namespace Avalonia.Controls.UnitTests.Presenters
target.ApplyTemplate();
Assert.IsType<Decorator>(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);
}
}
}

Loading…
Cancel
Save