diff --git a/src/Markup/Perspex.Markup/Binding/LogicalNotNode.cs b/src/Markup/Perspex.Markup/Binding/LogicalNotNode.cs index 55244e28eb..ca35ea5f12 100644 --- a/src/Markup/Perspex.Markup/Binding/LogicalNotNode.cs +++ b/src/Markup/Perspex.Markup/Binding/LogicalNotNode.cs @@ -14,6 +14,11 @@ namespace Perspex.Markup.Binding { } + public override bool SetValue(object value) + { + throw new NotSupportedException("Cannot set a negated binding."); + } + public override IDisposable Subscribe(IObserver observer) { return Next.Select(x => Negate(x)).Subscribe(observer); diff --git a/tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Negation.cs b/tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Negation.cs index b38fb809bb..614f27b34c 100644 --- a/tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Negation.cs +++ b/tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Negation.cs @@ -1,6 +1,7 @@ // Copyright (c) The Perspex Project. All rights reserved. // Licensed under the MIT license. See licence.md file in the project root for full license information. +using System; using System.Reactive.Linq; using Perspex.Markup.Binding; using Xunit; @@ -64,6 +65,16 @@ namespace Perspex.Markup.UnitTests.Binding Assert.Equal(false, result.Value); } + [Fact] + public async void Should_Return_Empty_For_String_Not_Convertible_To_Boolean() + { + var data = new { Foo = "foo" }; + var target = new ExpressionObserver(data, "!Foo"); + var result = await target.Take(1); + + Assert.False(result.HasValue); + } + [Fact] public async void Should_Return_Empty_For_Value_Not_Convertible_To_Boolean() { @@ -73,5 +84,14 @@ namespace Perspex.Markup.UnitTests.Binding Assert.False(result.HasValue); } + + [Fact] + public void SetValue_Should_Throw() + { + var data = new { Foo = "foo" }; + var target = new ExpressionObserver(data, "!Foo"); + + Assert.Throws(() => target.SetValue("bar")); + } } }