Browse Source

Handle completed tasks.

Steven Kirk 10 years ago
parent
commit
482dfa0174

+ 20 - 4
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<object>;
             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;
             }
         }
 

+ 16 - 1
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<object>();
+
+                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()
         {