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 12 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 Perspex.Diagnostics;
using Splat; using Splat;
using System.Reactive.Disposables; using System.Reactive.Disposables;
using Perspex.Reactive;
/// <summary> /// <summary>
/// The priority of a binding. /// The priority of a binding.
@ -306,7 +306,7 @@ namespace Perspex
{ {
Contract.Requires<NullReferenceException>(property != null); Contract.Requires<NullReferenceException>(property != null);
return Observable.Create<object>(observer => return new PerspexObservable<object>(observer =>
{ {
EventHandler<PerspexPropertyChangedEventArgs> handler = (s, e) => EventHandler<PerspexPropertyChangedEventArgs> handler = (s, e) =>
{ {
@ -318,19 +318,19 @@ namespace Perspex
this.PropertyChanged += handler; this.PropertyChanged += handler;
return () => return Disposable.Create(() =>
{ {
this.PropertyChanged -= handler; this.PropertyChanged -= handler;
}; });
}).StartWith(this.GetValue(property)); }, this.GetObservableDescription(property)).StartWith(this.GetValue(property));
} }
/// <summary> /// <summary>
/// Gets an observable for a <see cref="PerspexProperty"/>. /// Gets an observable for a <see cref="PerspexProperty"/>.
/// </summary> /// </summary>
/// <typeparam name="T"></typeparam> /// <typeparam name="T">The property type.</typeparam>
/// <param name="property"></param> /// <param name="property">The property.</param>
/// <returns></returns> /// <returns>An observable.</returns>
public IObservable<T> GetObservable<T>(PerspexProperty<T> property) public IObservable<T> GetObservable<T>(PerspexProperty<T> property)
{ {
Contract.Requires<NullReferenceException>(property != null); Contract.Requires<NullReferenceException>(property != null);
@ -346,7 +346,7 @@ namespace Perspex
/// <returns></returns> /// <returns></returns>
public IObservable<Tuple<T, T>> GetObservableWithHistory<T>(PerspexProperty<T> property) 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) => EventHandler<PerspexPropertyChangedEventArgs> handler = (s, e) =>
{ {
@ -358,11 +358,11 @@ namespace Perspex
this.PropertyChanged += handler; this.PropertyChanged += handler;
return () => return Disposable.Create(() =>
{ {
this.PropertyChanged -= handler; this.PropertyChanged -= handler;
}; });
}); }, this.GetObservableDescription(property));
} }
/// <summary> /// <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> /// <summary>
/// Raises the <see cref="PropertyChanged"/> event. /// Raises the <see cref="PropertyChanged"/> event.
/// </summary> /// </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