diff options
-rw-r--r-- | Xamarin.Forms.Core.UnitTests/BindableObjectUnitTests.cs | 30 | ||||
-rw-r--r-- | Xamarin.Forms.Core/BindableObject.cs | 3 |
2 files changed, 32 insertions, 1 deletions
diff --git a/Xamarin.Forms.Core.UnitTests/BindableObjectUnitTests.cs b/Xamarin.Forms.Core.UnitTests/BindableObjectUnitTests.cs index 861d9af1..9db091e5 100644 --- a/Xamarin.Forms.Core.UnitTests/BindableObjectUnitTests.cs +++ b/Xamarin.Forms.Core.UnitTests/BindableObjectUnitTests.cs @@ -123,6 +123,36 @@ namespace Xamarin.Forms.Core.UnitTests Assert.AreEqual(count, 1); } + class MockVMEquals { + public string Key { get; set; } + public string Text { get; set; } + public override bool Equals(object obj) + { + var other = obj as MockVMEquals; + if (other == null) + return false; + return Key == other.Key; + } + + public override int GetHashCode() + { + return base.GetHashCode(); + } + } + + [Test] + //https://bugzilla.xamarin.com/show_bug.cgi?id=59507 + public void BindingContextChangedCompareReferences() + { + var mock = new MockBindable(); + mock.BindingContext = new MockVMEquals { Key = "Foo", Text = "Foo" }; + mock.BindingContextChanged += (sender, args) => Assert.Pass(); + + mock.BindingContext = new MockVMEquals { Key = "Foo", Text = "Bar" }; + + Assert.Fail("The BindingContextChanged event was not fired."); + } + [Test] public void ParentAndChildBindingContextChanged() { diff --git a/Xamarin.Forms.Core/BindableObject.cs b/Xamarin.Forms.Core/BindableObject.cs index 755ad8f0..1df88b7d 100644 --- a/Xamarin.Forms.Core/BindableObject.cs +++ b/Xamarin.Forms.Core/BindableObject.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.ComponentModel; using System.Diagnostics; +using System.Reflection; using System.Runtime.CompilerServices; using Xamarin.Forms.Internals; @@ -552,7 +553,7 @@ namespace Xamarin.Forms bool clearOneWayBindings = (attributes & SetValueFlags.ClearOneWayBindings) != 0; bool clearTwoWayBindings = (attributes & SetValueFlags.ClearTwoWayBindings) != 0; - bool same = Equals(value, original); + bool same = ReferenceEquals(context.Property, BindingContextProperty) ? ReferenceEquals(value, original) : Equals(value, original); if (!silent && (!same || raiseOnEqual)) { if (property.PropertyChanging != null) |