diff --git a/src/Avalonia.Base/ValueStore.cs b/src/Avalonia.Base/ValueStore.cs index 470be35592..9ece2b8042 100644 --- a/src/Avalonia.Base/ValueStore.cs +++ b/src/Avalonia.Base/ValueStore.cs @@ -138,7 +138,7 @@ namespace Avalonia IObservable> source, BindingPriority priority) { - if (_values.TryGetValue(property, out var slot)) + if (_values.TryGetValue(property, out var slot) && !IsRemoveSentinel(slot)) { return BindExisting(slot, property, source, priority); } @@ -338,7 +338,7 @@ namespace Avalonia private void AddValue(AvaloniaProperty property, IValue value) { _values.AddValue(property, value); - if (_batchUpdate is object && value is IBatchUpdate batch) + if (_batchUpdate?.IsBatchUpdating == true && value is IBatchUpdate batch) batch.BeginBatchUpdate(); value.Start(); } @@ -381,6 +381,8 @@ namespace Avalonia public BatchUpdate(ValueStore owner) => _owner = owner; + public bool IsBatchUpdating => _batchUpdateCount > 0; + public void Begin() { if (_batchUpdateCount++ == 0) diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_BatchUpdate.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_BatchUpdate.cs index 5bf3afc9e7..036f275a71 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_BatchUpdate.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_BatchUpdate.cs @@ -478,6 +478,7 @@ namespace Avalonia.Base.UnitTests { var target = new TestClass(); var raised = 0; + var notifications = new List(); target.Foo = "foo"; @@ -490,11 +491,16 @@ namespace Avalonia.Base.UnitTests target.Bind(TestClass.FooProperty, new TestObservable("bar")); ++raised; } + + notifications.Add(e); }; target.EndBatchUpdate(); Assert.Equal("bar", target.Foo); Assert.Equal(1, raised); + Assert.Equal(2, notifications.Count); + Assert.Equal(null, notifications[0].NewValue); + Assert.Equal("bar", notifications[1].NewValue); } public class TestClass : AvaloniaObject