Browse Source

Handle completed tasks.

pull/237/head
Steven Kirk 11 years ago
parent
commit
482dfa0174
  1. 24
      src/Markup/Perspex.Markup/Binding/PropertyAccessorNode.cs
  2. 17
      tests/Perspex.Markup.UnitTests/Binding/ExpressionObserverTests_Task.cs

24
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;
}
}

17
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()
{

Loading…
Cancel
Save