From 5109b00644ea834ab65bc6f9681e6a7717458634 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sun, 20 Dec 2020 18:04:01 -0500 Subject: [PATCH 1/3] Reuse PropertyType in the ShouldNotSet method --- src/Avalonia.Base/Data/Core/SettableNode.cs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/Avalonia.Base/Data/Core/SettableNode.cs b/src/Avalonia.Base/Data/Core/SettableNode.cs index d0a918dc88..363d3da0ef 100644 --- a/src/Avalonia.Base/Data/Core/SettableNode.cs +++ b/src/Avalonia.Base/Data/Core/SettableNode.cs @@ -15,7 +15,8 @@ namespace Avalonia.Data.Core private bool ShouldNotSet(object value) { - if (PropertyType == null) + var propertyType = PropertyType; + if (propertyType == null) { return false; } @@ -37,7 +38,7 @@ namespace Avalonia.Data.Core return false; } - if (PropertyType.IsValueType) + if (propertyType.IsValueType) { return lastValue.Equals(value); } From b240fc7d0c75bbfc2e060c78b67e4af4278e638f Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sun, 20 Dec 2020 18:05:59 -0500 Subject: [PATCH 2/3] Add failing and working tests for null DataContext --- .../AvaloniaObjectTests_Binding.cs | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs index 7fc0d52be6..7c4c5c96a5 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_Binding.cs @@ -4,6 +4,8 @@ using System.Reactive.Linq; using System.Reactive.Subjects; using System.Threading; using System.Threading.Tasks; + +using Avalonia.Controls; using Avalonia.Data; using Avalonia.Logging; using Avalonia.Platform; @@ -797,6 +799,24 @@ namespace Avalonia.Base.UnitTests Assert.False(source.SetterCalled); } + [Fact] + public void TwoWay_Binding_Should_Not_Fail_With_Null_DataContext() + { + var target = new TextBlock(); + target.DataContext = null; + + target.Bind(TextBlock.TextProperty, new Binding("Missing", BindingMode.TwoWay)); + } + + [Fact] + public void TwoWay_Binding_Should_Not_Fail_With_Null_DataContext_Indexer() + { + var target = new TextBlock(); + target.DataContext = null; + + target.Bind(TextBlock.TextProperty, new Binding("[0]", BindingMode.TwoWay)); + } + [Fact] public void Disposing_Completed_Binding_Does_Not_Throw() { From d020d9872cbd385b8bf124b224f611bf58d15a43 Mon Sep 17 00:00:00 2001 From: Max Katz Date: Sun, 20 Dec 2020 18:07:06 -0500 Subject: [PATCH 3/3] Fix failing test when DataContext is null --- .../Markup/Parsers/Nodes/StringIndexerNode.cs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs b/src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs index 76fbc9a982..f3abd6a5c5 100644 --- a/src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs +++ b/src/Markup/Avalonia.Markup/Markup/Parsers/Nodes/StringIndexerNode.cs @@ -129,7 +129,10 @@ namespace Avalonia.Markup.Parsers.Nodes { get { - Target.TryGetTarget(out object target); + if (!Target.TryGetTarget(out object target)) + { + return null; + } return GetIndexer(target.GetType().GetTypeInfo())?.PropertyType; }