Browse Source

Added PerspexObservable.

Similar to Rx's AnonymousObservable that is created using
Observable.Create, but it also implements IDescription. This description
is populated when created by PerspexObject.GetObservable.
pull/58/head
Steven Kirk 11 years ago
parent
commit
cffe103acc
  1. 34
      Perspex.Base/PerspexObject.cs
  2. 35
      Perspex.Base/Reactive/PerspexObservable.cs

34
Perspex.Base/PerspexObject.cs

@ -15,7 +15,7 @@ namespace Perspex
using Perspex.Diagnostics;
using Splat;
using System.Reactive.Disposables;
using Perspex.Reactive;
/// <summary>
/// The priority of a binding.
@ -306,7 +306,7 @@ namespace Perspex
{
Contract.Requires<NullReferenceException>(property != null);
return Observable.Create<object>(observer =>
return new PerspexObservable<object>(observer =>
{
EventHandler<PerspexPropertyChangedEventArgs> handler = (s, e) =>
{
@ -318,19 +318,19 @@ namespace Perspex
this.PropertyChanged += handler;
return () =>
return Disposable.Create(() =>
{
this.PropertyChanged -= handler;
};
}).StartWith(this.GetValue(property));
});
}, this.GetObservableDescription(property)).StartWith(this.GetValue(property));
}
/// <summary>
/// Gets an observable for a <see cref="PerspexProperty"/>.
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="property"></param>
/// <returns></returns>
/// <typeparam name="T">The property type.</typeparam>
/// <param name="property">The property.</param>
/// <returns>An observable.</returns>
public IObservable<T> GetObservable<T>(PerspexProperty<T> property)
{
Contract.Requires<NullReferenceException>(property != null);
@ -346,7 +346,7 @@ namespace Perspex
/// <returns></returns>
public IObservable<Tuple<T, T>> GetObservableWithHistory<T>(PerspexProperty<T> property)
{
return Observable.Create<Tuple<T, T>>(observer =>
return new PerspexObservable<Tuple<T, T>>(observer =>
{
EventHandler<PerspexPropertyChangedEventArgs> handler = (s, e) =>
{
@ -358,11 +358,11 @@ namespace Perspex
this.PropertyChanged += handler;
return () =>
return Disposable.Create(() =>
{
this.PropertyChanged -= handler;
};
});
});
}, this.GetObservableDescription(property));
}
/// <summary>
@ -759,6 +759,16 @@ namespace Perspex
}
}
/// <summary>
/// Gets a description of a property that van be used in observables.
/// </summary>
/// <param name="property">The property</param>
/// <returns>The description.</returns>
private string GetObservableDescription(PerspexProperty property)
{
return string.Format("{0}.{1}", this.GetType().Name, property.Name);
}
/// <summary>
/// Raises the <see cref="PropertyChanged"/> event.
/// </summary>

35
Perspex.Base/Reactive/PerspexObservable.cs

@ -0,0 +1,35 @@
// -----------------------------------------------------------------------
// <copyright file="PerspexObject.cs" company="Steven Kirk">
// Copyright 2014 MIT Licence. See licence.md for more information.
// </copyright>
// -----------------------------------------------------------------------
namespace Perspex.Reactive
{
using System;
using System.Reactive;
using System.Reactive.Disposables;
public sealed class PerspexObservable<T> : ObservableBase<T>, IDescription
{
private readonly Func<IObserver<T>, IDisposable> subscribe;
public string Description { get; }
public PerspexObservable(Func<IObserver<T>, IDisposable> subscribe, string description)
{
if (subscribe == null)
{
throw new ArgumentNullException("subscribe");
}
this.subscribe = subscribe;
this.Description = description;
}
protected override IDisposable SubscribeCore(IObserver<T> observer)
{
return this.subscribe(observer) ?? Disposable.Empty;
}
}
}
Loading…
Cancel
Save