diff --git a/src/Markup/Perspex.Markup/Binding/PropertyAccessorNode.cs b/src/Markup/Perspex.Markup/Binding/PropertyAccessorNode.cs index 5a3ba93f44..08ecafac6a 100644 --- a/src/Markup/Perspex.Markup/Binding/PropertyAccessorNode.cs +++ b/src/Markup/Perspex.Markup/Binding/PropertyAccessorNode.cs @@ -87,10 +87,12 @@ namespace Perspex.Markup.Binding var value = _propertyInfo.GetValue(target); var observable = value as IObservable; var task = value as Task; + bool set = false; if (observable != null) { CurrentValue = ExpressionValue.None; + set = true; _subscription = observable .ObserveOn(SynchronizationContext.Current) .Subscribe(x => CurrentValue = new ExpressionValue(x)); @@ -101,15 +103,29 @@ namespace Perspex.Markup.Binding if (resultProperty != null) { - task.ContinueWith( - x => CurrentValue = new ExpressionValue(resultProperty.GetValue(task)), - TaskScheduler.FromCurrentSynchronizationContext()) - .ConfigureAwait(false); + if (task.Status == TaskStatus.RanToCompletion) + { + CurrentValue = new ExpressionValue(resultProperty.GetValue(task)); + set = true; + } + else + { + task.ContinueWith( + x => CurrentValue = new ExpressionValue(resultProperty.GetValue(task)), + TaskScheduler.FromCurrentSynchronizationContext()) + .ConfigureAwait(false); + } } } else { CurrentValue = new ExpressionValue(value); + set = true; + } + + if (!set) + { + CurrentValue = ExpressionValue.None; } } diff --git a/tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Task.cs b/tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Task.cs index 9cb0cd4454..6ab8b88415 100644 --- a/tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Task.cs +++ b/tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Task.cs @@ -30,7 +30,22 @@ namespace Perspex.Markup.UnitTests.Binding Assert.Equal(new object[] { null, "foo" }, result.ToArray()); } } - + + [Fact] + public void Should_Get_Completed_Task_Value() + { + using (var sync = UnitTestSynchronizationContext.Begin()) + { + var data = new { Foo = Task.FromResult("foo") }; + var target = new ExpressionObserver(data, "Foo"); + var result = new List(); + + var sub = target.Subscribe(x => result.Add(x.Value)); + + Assert.Equal(new object[] { "foo" }, result.ToArray()); + } + } + [Fact] public void Should_Get_Property_Value_From_Task() {