public ViewModelViewHost(NSView targetView) { NSView viewLastAdded = null; this.WhenAny(x => x.DefaultContent, x => x.ViewModel, (c, v) => Unit.Default) .Subscribe(_ => { if (viewLastAdded != null) { viewLastAdded.RemoveFromSuperview(); } if (ViewModel == null) { if (DefaultContent != null) { targetView.AddSubview(DefaultContent.View); } return; } var view = RxRouting.ResolveView(ViewModel); view.ViewModel = ViewModel; viewLastAdded = ((NSViewController)view).View; targetView.AddSubview(viewLastAdded); }); }
void updateRouter() { if (currentRouterSub != null) { currentRouterSub.Dispose(); currentRouterSub = null; } if (Router == null) { return; } currentRouterSub = Router.ViewModelObservable().Subscribe(vm => { if (vm == null) { Child = DefaultContent; return; } var view = RxRouting.ResolveView(vm); view.ViewModel = vm; Child = (Widget)view; }); }
public void ResolvePureInterfaceType() { RxApp.ConfigureServiceLocator( (x, _) => (x == typeof(IViewForViewModel <IFooBarViewModel>) ? new FooBarView() : null), (x, _) => null); var vm = new FooBarViewModel(null); var result = RxRouting.ResolveView(vm); this.Log().Info(result.GetType().FullName); Assert.True(result is FooBarView); }
public void ResolveExplicitViewType() { RxApp.ConfigureServiceLocator( (x, _) => (x.Name == "IBazView" ? new BazView() : null), (x, _) => null); var vm = new BazViewModel(null); var result = RxRouting.ResolveView(vm); this.Log().Info(result.GetType().FullName); Assert.True(result is BazView); }
public RoutedViewHost(NSView targetView) { NSView viewLastAdded = null; this.WhenAny(x => x.Router.NavigationStack, x => x.Value) .SelectMany(x => x.CollectionCountChanged.StartWith(x.Count).Select(_ => x.LastOrDefault())) .Subscribe(vm => { if (viewLastAdded != null) { viewLastAdded.RemoveFromSuperview(); } if (vm == null) { if (DefaultContent != null) { targetView.AddSubview(DefaultContent.View); } return; } var view = RxRouting.ResolveView(vm); view.ViewModel = vm; if (view is NSViewController) { viewLastAdded = ((NSViewController)view).View; } else if (view is NSView) { viewLastAdded = (NSView)view; } else { throw new Exception(String.Format("'{0}' must be an NSViewController or NSView", view.GetType().FullName)); } targetView.AddSubview(viewLastAdded); }, ex => RxApp.DefaultExceptionHandler.OnNext(ex)); }
public ActivityRoutedViewHost(Activity hostActivity) { var keyUp = hostActivity.GetType() .GetMethods(BindingFlags.Public | BindingFlags.DeclaredOnly | BindingFlags.NonPublic | BindingFlags.Instance) .FirstOrDefault(x => x.Name == "OnKeyUp"); if (keyUp == null) { throw new Exception("You must override OnKeyUp and call theRoutedViewHost.OnKeyUp"); } var viewFor = hostActivity as IViewFor; if (viewFor == null) { throw new Exception("You must implement IViewFor<TheViewModelClass>"); } bool firstSet = false; _inner = _hostScreen.Router.ViewModelObservable() .Where(x => x != null) .Subscribe(vm => { if (!firstSet) { viewFor.ViewModel = vm; firstSet = true; return; } var view = RxRouting.ResolveView(vm); if (view.GetType() != typeof(Type)) { throw new Exception("Views in Android must be the Type of an Activity"); } hostActivity.StartActivity((Type)view); }); }