diff --git a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_BatchUpdate.cs b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_BatchUpdate.cs index 036f275a71..53ad87421e 100644 --- a/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_BatchUpdate.cs +++ b/tests/Avalonia.Base.UnitTests/AvaloniaObjectTests_BatchUpdate.cs @@ -53,6 +53,21 @@ namespace Avalonia.Base.UnitTests Assert.Empty(raised); } + [Fact] + public void Binding_Disposal_Should_Not_Raise_Property_Changes_During_Batch_Update() + { + var target = new TestClass(); + var observable = new TestObservable("foo"); + var raised = new List(); + + var sub = target.Bind(TestClass.FooProperty, observable, BindingPriority.LocalValue); + target.GetObservable(TestClass.FooProperty).Skip(1).Subscribe(x => raised.Add(x)); + target.BeginBatchUpdate(); + sub.Dispose(); + + Assert.Empty(raised); + } + [Fact] public void SetValue_Change_Should_Be_Raised_After_Batch_Update_1() { @@ -240,6 +255,27 @@ namespace Avalonia.Base.UnitTests Assert.Equal(BindingPriority.Unset, raised[0].Priority); } + [Fact] + public void Binding_Disposal_Should_Be_Raised_After_Batch_Update() + { + var target = new TestClass(); + var observable = new TestObservable("foo"); + var raised = new List(); + + var sub = target.Bind(TestClass.FooProperty, observable, BindingPriority.LocalValue); + target.PropertyChanged += (s, e) => raised.Add(e); + + target.BeginBatchUpdate(); + sub.Dispose(); + target.EndBatchUpdate(); + + Assert.Equal(1, raised.Count); + Assert.Null(target.Foo); + Assert.Equal("foo", raised[0].OldValue); + Assert.Null(raised[0].NewValue); + Assert.Equal(BindingPriority.Unset, raised[0].Priority); + } + [Fact] public void ClearValue_Change_Should_Be_Raised_After_Batch_Update_1() { @@ -503,6 +539,38 @@ namespace Avalonia.Base.UnitTests Assert.Equal("bar", notifications[1].NewValue); } + [Fact] + public void Can_Bind_Completed_Binding_Back_To_Original_Value_When_Ending_Batch_Update() + { + var target = new TestClass(); + var raised = 0; + var notifications = new List(); + var observable1 = new TestObservable("foo"); + var observable2 = new TestObservable("foo"); + + target.Bind(TestClass.FooProperty, observable1); + + target.BeginBatchUpdate(); + observable1.OnCompleted(); + target.PropertyChanged += (sender, e) => + { + if (e.Property == TestClass.FooProperty && e.NewValue is null) + { + target.Bind(TestClass.FooProperty, observable2); + ++raised; + } + + notifications.Add(e); + }; + target.EndBatchUpdate(); + + Assert.Equal("foo", target.Foo); + Assert.Equal(1, raised); + Assert.Equal(2, notifications.Count); + Assert.Equal(null, notifications[0].NewValue); + Assert.Equal("foo", notifications[1].NewValue); + } + public class TestClass : AvaloniaObject { public static readonly StyledProperty FooProperty =