public WindowViewModel( ViewContainer.Factory viewContainerFactory, MenuBuilder.Factory menuItemsFactory, IInterTabClient interTabClient) { _viewContainerFactory = viewContainerFactory; _menuItemsFactory = menuItemsFactory; InterTabClient = interTabClient; _showMenuCommand = ReactiveCommand.Create(ShowMenu, Observable.Return <bool>(Selected != null && !(Selected.Content is MenuBuilder))); ShowInGitHubCommand = ReactiveCommand.Create(() => Process.Start("https://github.com/RolandPheasant")); var menuController = Views.ToObservableChangeSet() .Filter(vc => vc.Content is MenuBuilder) .Transform(vc => (MenuBuilder)vc.Content) .MergeMany(menuItems => menuItems.ItemCreated) .Subscribe(item => { Views.Add(item); Selected = item; }); _cleanUp = Disposable.Create(() => { menuController.Dispose(); foreach (var disposable in Views.Select(vc => vc.Content).OfType <IDisposable>()) { disposable.Dispose(); } }); }
public MenuBuilder(//ILogger logger, ViewContainer.Factory viewContainerFactory, RxUiHostViewModel.Factory rxUiHostViewModelFactory, RxUiViewModel.Factory rxUiViewModelFactory) { //_logger = logger; _viewContainerFactory = viewContainerFactory; _rxUiHostViewModelFactory = rxUiHostViewModelFactory; _menuItems = new List <MenuItem> { new MenuItem("Live Trades (RxUI)", "A basic example, illustrating where reactive-ui and dynamic data can work together", () => OpenRxUi("Live Trades (RxUI)", rxUiViewModelFactory()), MenuCategory.ReactiveUi, new [] { new Link("View Model", "RxUiViewModel.cs", ""), new Link("Blog", "Integration with reactive ui", ""), }), }; var filterApplier = this.WhenValueChanged(t => t.Category) .Subscribe(value => { Items = _menuItems.Where(menu => menu.Category == value).ToArray(); }); _cleanUp = Disposable.Create(() => { _viewCreatedSubject.OnCompleted(); filterApplier.Dispose(); }); }