Skip to content

Instantly share code, notes, and snippets.

@nverinaud
Last active August 29, 2015 13:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nverinaud/10268939 to your computer and use it in GitHub Desktop.
Save nverinaud/10268939 to your computer and use it in GitHub Desktop.
ReactiveUI controller bindings stuff
using System;
using ReactiveUI.Cocoa;
using MonoTouch.Foundation;
using ReactiveUI;
using System.Reactive.Linq;
using MonoTouch.UIKit;
using System.Drawing;
namespace MyApp
{
public class AppViewController : ReactiveViewController, IViewFor<MyAppViewModel>
{
public AppViewController()
{
Setup();
}
public AppViewController(NSCoder c) : base(c)
{
Setup();
}
public AppViewController(NSObjectFlag f) : base(f)
{
Setup();
}
public AppViewController(IntPtr handle) : base(handle)
{
Setup();
}
public AppViewController(string nibNameOrNull, NSBundle nibBundleOrNull) : base(nibNameOrNull, nibBundleOrNull)
{
Setup();
}
void Setup()
{
}
public override void ViewDidLoad()
{
base.ViewDidLoad();
/* View model observing */
this.WhenAnyValue(self => self.ViewModel).Subscribe(vm => {
TearDownBindings();
SetupBindings();
});
}
public override void ViewDidDisappear(bool animated)
{
base.ViewDidDisappear(animated);
if (ReferenceEquals(null, NavigationController))
{
TearDownBindings();
}
}
public override void DidMoveToParentViewController(UIViewController parent)
{
base.DidMoveToParentViewController(parent);
if (ReferenceEquals(null, parent))
{
TearDownBindings();
}
}
CompositeDisposable _subscribers;
MyAppViewModel _viewModel;
public MyAppViewModel ViewModel {
get { return _viewModel; }
set { this.RaiseAndSetIfChanged(ref _viewModel, value); }
}
object IViewFor.ViewModel {
get { return ViewModel; }
set { ViewModel = (MyAppViewModel)value; }
}
void TearDownBindings()
{
if (_subscribers != null)
{
_subscribers.Dispose();
_subscribers = null;
}
}
void SetupBindings()
{
if (_subscribers == null && ViewModel != null)
{
_subscribers = new CompositeDisposable();
IDisposable subscriber = null;
subscriber = ViewModel.WhenAnyValue(vm => vm.AnObservableProperty).Subscribe(theProp => {
// Do something with theProp
});
_subscribers.Add(subscriber);
}
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
if (disposing)
{
TearDownBindings();
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment