diff --git a/src/Avalonia.Visuals/Visual.cs b/src/Avalonia.Visuals/Visual.cs
index 2c96d87bb6..322b630e83 100644
--- a/src/Avalonia.Visuals/Visual.cs
+++ b/src/Avalonia.Visuals/Visual.cs
@@ -489,11 +489,8 @@ namespace Avalonia
protected internal sealed override void LogBindingError(AvaloniaProperty property, Exception e)
{
- // Don't log a binding error unless the control is attached to a logical or visual tree.
- // In theory this should only need to check for logical tree attachment, but in practise
- // due to ContentControlMixin only taking effect when the template has finished being
- // applied, some controls are attached to the visual tree before the logical tree.
- if (((ILogical)this).IsAttachedToLogicalTree || ((IVisual)this).IsAttachedToVisualTree)
+ // Don't log a binding error unless the control is attached to a logical tree.
+ if (((ILogical)this).IsAttachedToLogicalTree)
{
if (e is BindingChainException b &&
string.IsNullOrEmpty(b.ExpressionErrorPoint) &&
diff --git a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
index 32f90d5cbf..c4c1f49346 100644
--- a/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
+++ b/tests/Avalonia.Base.UnitTests/Avalonia.Base.UnitTests.csproj
@@ -14,6 +14,7 @@
+
diff --git a/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs b/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs
new file mode 100644
index 0000000000..d160713023
--- /dev/null
+++ b/tests/Avalonia.Base.UnitTests/Logging/LoggingTests.cs
@@ -0,0 +1,73 @@
+using Avalonia.Controls;
+using Avalonia.Controls.Shapes;
+using Avalonia.Markup.Xaml;
+using Avalonia.UnitTests;
+using Xunit;
+
+namespace Avalonia.Base.UnitTests.Logging
+{
+ public class LoggingTests
+ {
+ [Fact]
+ public void Control_Should_Not_Log_Binding_Errors_When_Detached_From_Visual_Tree()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var xaml = @"
+
+
+
+
+";
+
+ var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
+ var calledTimes = 0;
+ using var logSink = TestLogSink.Start((l, a, s, m, d) =>
+ {
+ if (l >= Avalonia.Logging.LogEventLevel.Warning)
+ {
+ calledTimes++;
+ }
+ });
+ var panel = window.FindControl("panel");
+ var rect = window.FindControl("rect");
+ window.ApplyTemplate();
+ window.Presenter.ApplyTemplate();
+ panel.Children.Remove(rect);
+ Assert.Equal(0, calledTimes);
+ }
+ }
+
+ [Fact]
+ public void Control_Should_Log_Binding_Errors_When_No_Ancestor_With_Such_Name()
+ {
+ using (UnitTestApplication.Start(TestServices.StyledWindow))
+ {
+ var xaml = @"
+
+
+
+
+";
+ var calledTimes = 0;
+ using var logSink = TestLogSink.Start((l, a, s, m, d) =>
+ {
+ if (l >= Avalonia.Logging.LogEventLevel.Warning && s is Rectangle)
+ {
+ calledTimes++;
+ }
+ });
+ var window = (Window)AvaloniaRuntimeXamlLoader.Load(xaml);
+ window.ApplyTemplate();
+ window.Presenter.ApplyTemplate();
+ Assert.Equal(1, calledTimes);
+ }
+ }
+ }
+
+
+}