From f9b578ab0ed4faa63568992a3b1370b2c192564d Mon Sep 17 00:00:00 2001 From: Jeremy Koritzinsky Date: Sat, 11 Nov 2017 23:57:58 -0600 Subject: [PATCH] Make AncestorType required for ancestor searching via the visual tree. --- src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs | 5 +++++ .../Xaml/BindingTests_RelativeSource.cs | 17 ++++------------- 2 files changed, 9 insertions(+), 13 deletions(-) diff --git a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs index d4d53b091f..ae9d2d87f1 100644 --- a/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs +++ b/src/Markup/Avalonia.Markup.Xaml/Data/Binding.cs @@ -126,6 +126,11 @@ namespace Avalonia.Markup.Xaml.Data } else if (RelativeSource.Mode == RelativeSourceMode.FindAncestor) { + if (RelativeSource.Tree == TreeType.Visual && RelativeSource.AncestorType == null) + { + throw new InvalidOperationException("AncestorType must be set for RelativeSourceModel.FindAncestor when searching the visual tree."); + } + observer = CreateFindAncestorObserver( (target as IControl) ?? (anchor as IControl), RelativeSource, diff --git a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests_RelativeSource.cs b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests_RelativeSource.cs index 8ff802f96b..095aae7742 100644 --- a/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests_RelativeSource.cs +++ b/tests/Avalonia.Markup.Xaml.UnitTests/Xaml/BindingTests_RelativeSource.cs @@ -3,6 +3,7 @@ using Avalonia.Controls; using Avalonia.UnitTests; +using System; using Xunit; namespace Avalonia.Markup.Xaml.UnitTests.Xaml @@ -78,7 +79,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml } [Fact] - public void Binding_To_First_Ancestor_Without_AncestorType_Uses_LogicalTree() + public void Binding_To_First_Ancestor_Without_AncestorType_Throws_Exception() { using (UnitTestApplication.Start(TestServices.StyledWindow)) { @@ -93,13 +94,7 @@ namespace Avalonia.Markup.Xaml.UnitTests.Xaml "; var loader = new AvaloniaXamlLoader(); - var window = (Window)loader.Load(xaml); - var contentControl = window.FindControl("contentControl"); - var button = window.FindControl