Browse Source

Don't notify AvaloniaProperty.Changed on non-effective value change.

pull/3720/head
Steven Kirk 6 years ago
parent
commit
959d0cce1e
  1. 6
      src/Avalonia.Base/AvaloniaObject.cs
  2. 2
      src/Avalonia.Base/AvaloniaPropertyChangedEventArgs.cs
  3. 2
      src/Avalonia.Base/PropertyStore/PriorityValue.cs
  4. 14
      tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs

6
src/Avalonia.Base/AvaloniaObject.cs

@ -769,7 +769,11 @@ namespace Avalonia
try try
{ {
OnPropertyChangedCore(change); OnPropertyChangedCore(change);
change.Property.NotifyChanged(change);
if (change.IsEffectiveValueChange && !change.IsOutdated)
{
change.Property.NotifyChanged(change);
}
if (_listeners is object && _listeners.TryGetValue(change.Property, out var listener)) if (_listeners is object && _listeners.TryGetValue(change.Property, out var listener))
{ {

2
src/Avalonia.Base/AvaloniaPropertyChangedEventArgs.cs

@ -80,7 +80,7 @@ namespace Avalonia
public bool IsOutdated { get; private set; } public bool IsOutdated { get; private set; }
internal void MarkOutdated() => IsOutdated = true; internal void MarkOutdated() => IsOutdated = true;
internal void MarkInactiveValue() => IsEffectiveValueChange = false; internal void MarkNonEffectiveValue() => IsEffectiveValueChange = false;
protected abstract AvaloniaProperty GetProperty(); protected abstract AvaloniaProperty GetProperty();
protected abstract object? GetOldValue(); protected abstract object? GetOldValue();
protected abstract object? GetNewValue(); protected abstract object? GetNewValue();

2
src/Avalonia.Base/PropertyStore/PriorityValue.cs

@ -250,7 +250,7 @@ namespace Avalonia.PropertyStore
} }
else if (change is object) else if (change is object)
{ {
change.MarkInactiveValue(); change.MarkNonEffectiveValue();
change.SetOldValue(default); change.SetOldValue(default);
_sink.ValueChanged(change); _sink.ValueChanged(change);
} }

14
tests/Avalonia.Base.UnitTests/AvaloniaPropertyTests.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using Avalonia.Data; using Avalonia.Data;
using Avalonia.Utilities; using Avalonia.Utilities;
using Xunit; using Xunit;
@ -88,6 +89,19 @@ namespace Avalonia.Base.UnitTests
Assert.Equal("newvalue", value); Assert.Equal("newvalue", value);
} }
[Fact]
public void Changed_Observable_Fired_Only_On_Effective_Value_Change()
{
var target = new Class1();
var result = new List<string>();
Class1.FooProperty.Changed.Subscribe(x => result.Add((string)x.NewValue));
target.SetValue(Class1.FooProperty, "animated", BindingPriority.Animation);
target.SetValue(Class1.FooProperty, "local");
Assert.Equal(new[] { "animated" }, result);
}
[Fact] [Fact]
public void Property_Equals_Should_Handle_Null() public void Property_Equals_Should_Handle_Null()
{ {

Loading…
Cancel
Save