Last active
August 29, 2015 13:58
-
-
Save nverinaud/10268939 to your computer and use it in GitHub Desktop.
ReactiveUI controller bindings stuff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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