diff --git a/src/Markup/Perspex.Markup/Data/Plugins/InpcPropertyAccessorPlugin.cs b/src/Markup/Perspex.Markup/Data/Plugins/InpcPropertyAccessorPlugin.cs index 13970a9054..c52d1a3a26 100644 --- a/src/Markup/Perspex.Markup/Data/Plugins/InpcPropertyAccessorPlugin.cs +++ b/src/Markup/Perspex.Markup/Data/Plugins/InpcPropertyAccessorPlugin.cs @@ -105,7 +105,7 @@ namespace Perspex.Markup.Data.Plugins private void PropertyChanged(object sender, PropertyChangedEventArgs e) { - if (e.PropertyName == _property.Name) + if (e.PropertyName == _property.Name || string.IsNullOrEmpty(e.PropertyName)) { _changed(Value); } diff --git a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs index fe9336ebe6..ebf98a363e 100644 --- a/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs +++ b/tests/Perspex.Markup.UnitTests/Data/ExpressionObserverTests_Property.cs @@ -108,6 +108,34 @@ namespace Perspex.Markup.UnitTests.Data Assert.Equal(0, data.SubscriptionCount); } + [Fact] + public void Should_Trigger_PropertyChanged_On_Null_Or_Empty_String() + { + var data = new Class1 { Bar = "foo" }; + var target = new ExpressionObserver(data, "Bar"); + var result = new List(); + + var sub = target.Subscribe(x => result.Add(x)); + + Assert.Equal(new[] { "foo" }, result); + + data.Bar = "bar"; + + Assert.Equal(new[] { "foo" }, result); + + data.RaisePropertyChanged(string.Empty); + + Assert.Equal(new[] { "foo", "bar" }, result); + + data.RaisePropertyChanged(null); + + Assert.Equal(new[] { "foo", "bar", "bar" }, result); + + sub.Dispose(); + + Assert.Equal(0, data.SubscriptionCount); + } + [Fact] public void Should_Track_End_Of_Property_Chain_Changing() { @@ -324,6 +352,13 @@ namespace Perspex.Markup.UnitTests.Data } } + private string _bar; + public string Bar + { + get { return _bar; } + set { _bar = value; } + } + public INext Next { get { return _next; } @@ -333,6 +368,11 @@ namespace Perspex.Markup.UnitTests.Data RaisePropertyChanged(nameof(Next)); } } + + public void RaisePropertyChanged(string propertyName) + { + base.RaisePropertyChanged(propertyName); + } } private class Class2 : NotifyingBase, INext