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 value = _propertyInfo.GetValue(target);
var observable = value as IObservable<object>; var observable = value as IObservable<object>;
var task = value as Task; var task = value as Task;
bool set = false;
if (observable != null) if (observable != null)
{ {
CurrentValue = ExpressionValue.None; CurrentValue = ExpressionValue.None;
set = true;
_subscription = observable _subscription = observable
.ObserveOn(SynchronizationContext.Current) .ObserveOn(SynchronizationContext.Current)
.Subscribe(x => CurrentValue = new ExpressionValue(x)); .Subscribe(x => CurrentValue = new ExpressionValue(x));
@ -101,15 +103,29 @@ namespace Perspex.Markup.Binding
if (resultProperty != null) if (resultProperty != null)
{ {
task.ContinueWith( if (task.Status == TaskStatus.RanToCompletion)
x => CurrentValue = new ExpressionValue(resultProperty.GetValue(task)), {
TaskScheduler.FromCurrentSynchronizationContext()) CurrentValue = new ExpressionValue(resultProperty.GetValue(task));
.ConfigureAwait(false); set = true;
}
else
{
task.ContinueWith(
x => CurrentValue = new ExpressionValue(resultProperty.GetValue(task)),
TaskScheduler.FromCurrentSynchronizationContext())
.ConfigureAwait(false);
}
} }
} }
else else
{ {
CurrentValue = new ExpressionValue(value); 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()); 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] [Fact]
public void Should_Get_Property_Value_From_Task() public void Should_Get_Property_Value_From_Task()
{ {

Loading…
Cancel
Save