From ed4f46a6cf88f3c8c759b694c02a652705f24804 Mon Sep 17 00:00:00 2001 From: Steven Kirk Date: Fri, 2 Oct 2015 18:10:01 +0200 Subject: [PATCH] Don't throw when binding produces invalid value. --- src/Perspex.Base/PriorityValue.cs | 26 +++++++++---------- .../PerspexObjectTests_Binding.cs | 9 +++---- 2 files changed, 15 insertions(+), 20 deletions(-) diff --git a/src/Perspex.Base/PriorityValue.cs b/src/Perspex.Base/PriorityValue.cs index 53ecd8da99..011f07cfa0 100644 --- a/src/Perspex.Base/PriorityValue.cs +++ b/src/Perspex.Base/PriorityValue.cs @@ -212,25 +212,23 @@ namespace Perspex /// The priority level that the value came from. private void UpdateValue(object value, int priority) { - if (!TypeUtilities.TryCast(_valueType, value, out value)) + if (TypeUtilities.TryCast(_valueType, value, out value)) { - throw new InvalidOperationException(string.Format( - "Invalid value for Property '{0}': {1} ({2})", - _name, - value, - value?.GetType().FullName ?? "(null)")); - } + var old = _value; - var old = _value; + if (_validate != null) + { + value = _validate(value); + } - if (_validate != null) + ValuePriority = priority; + _value = value; + _changed.OnNext(Tuple.Create(old, _value)); + } + else { - value = _validate(value); + // TODO: Log error. } - - ValuePriority = priority; - _value = value; - _changed.OnNext(Tuple.Create(old, _value)); } /// diff --git a/tests/Perspex.Base.UnitTests/PerspexObjectTests_Binding.cs b/tests/Perspex.Base.UnitTests/PerspexObjectTests_Binding.cs index 7c8e60543d..49534082a9 100644 --- a/tests/Perspex.Base.UnitTests/PerspexObjectTests_Binding.cs +++ b/tests/Perspex.Base.UnitTests/PerspexObjectTests_Binding.cs @@ -59,14 +59,11 @@ namespace Perspex.Base.UnitTests } [Fact] - public void Bind_Throws_Exception_For_Invalid_Value_Type() + public void Bind_Ignores_Invalid_Value_Type() { Class1 target = new Class1(); - - Assert.Throws(() => - { - target.Bind((PerspexProperty)Class1.FooProperty, Observable.Return((object)123)); - }); + target.Bind((PerspexProperty)Class1.FooProperty, Observable.Return((object)123)); + Assert.Equal("foodefault", target.GetValue(Class1.FooProperty)); } [Fact]