|
using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using System.Collections.Generic;
namespace Slex.Lib.Interactions
{
/// <summary>
/// An abstract class for creating triggers based on an Observable (System.Reactive)
/// </summary>
public abstract class ObserverTrigger<T> : EventBasedTrigger
{
private IObservable<T> _observable;
private IDisposable _currentDisposable = null;
/// <summary>
/// The observable to which the event is assigned
/// </summary>
protected IObservable<T> Observable
{
get
{
return _observable;
}
set
{
//We don't want to re-initialize
if (_observable == value)
return;
Cleanup();
//Assigned value is null
if (value == null)
return;
_observable = value;
_currentDisposable = _observable.Subscribe(item => OnNext(item));
}
}
/// <summary>
/// On next action
/// </summary>
/// <param name="param"></param>
protected abstract void OnNext(object param);
/// <summary>
/// Disposes the observer
/// </summary>
public virtual void Cleanup()
{
if (_currentDisposable != null)
{
_currentDisposable.Dispose();
_currentDisposable = null;
}
}
/// <summary>
/// Cleanup when detaching
/// </summary>
protected override void OnDetaching()
{
Cleanup();
base.OnDetaching();
}
}
}
|
By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.
If a file you wish to view isn't highlighted, and is a text file (not binary), please
let us know and we'll add colourisation support for it.
Architect, Developer, Speaker | Wannabe GUT inventor & Data Scientist | Microsoft MVP in C#