Table of Contents

Class RoutingState

Namespace
ReactiveUI
Assembly
ReactiveUI.dll

RoutingState manages the ViewModel Stack and allows ViewModels to navigate to other ViewModels.

[DataContract]
[RequiresDynamicCode("RoutingState uses RxApp and ReactiveCommand which require dynamic code generation")]
[RequiresUnreferencedCode("RoutingState uses RxApp and ReactiveCommand which may require unreferenced code")]
public class RoutingState : ReactiveObject, IReactiveNotifyPropertyChanged<IReactiveObject>, IHandleObservableErrors, IReactiveObject, INotifyPropertyChanged, INotifyPropertyChanging, IEnableLogger
Inheritance
RoutingState
Implements
IEnableLogger
Inherited Members
Extension Methods
WhenAnyMixin.WhenAny<TSender, TRet, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(TSender?, Expression<Func<TSender, T1>>, Expression<Func<TSender, T2>>, Expression<Func<TSender, T3>>, Expression<Func<TSender, T4>>, Expression<Func<TSender, T5>>, Expression<Func<TSender, T6>>, Expression<Func<TSender, T7>>, Expression<Func<TSender, T8>>, Expression<Func<TSender, T9>>, Expression<Func<TSender, T10>>, Expression<Func<TSender, T11>>, Expression<Func<TSender, T12>>, Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, IObservedChange<TSender, T8>, IObservedChange<TSender, T9>, IObservedChange<TSender, T10>, IObservedChange<TSender, T11>, IObservedChange<TSender, T12>, TRet>)
WhenAnyMixin.WhenAny<TSender, TRet, T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(TSender?, Expression<Func<TSender, T1>>, Expression<Func<TSender, T2>>, Expression<Func<TSender, T3>>, Expression<Func<TSender, T4>>, Expression<Func<TSender, T5>>, Expression<Func<TSender, T6>>, Expression<Func<TSender, T7>>, Expression<Func<TSender, T8>>, Expression<Func<TSender, T9>>, Expression<Func<TSender, T10>>, Expression<Func<TSender, T11>>, Expression<Func<TSender, T12>>, Func<IObservedChange<TSender, T1>, IObservedChange<TSender, T2>, IObservedChange<TSender, T3>, IObservedChange<TSender, T4>, IObservedChange<TSender, T5>, IObservedChange<TSender, T6>, IObservedChange<TSender, T7>, IObservedChange<TSender, T8>, IObservedChange<TSender, T9>, IObservedChange<TSender, T10>, IObservedChange<TSender, T11>, IObservedChange<TSender, T12>, TRet>, bool)

Examples

public class ShellViewModel : ReactiveObject, IScreen
{
    public RoutingState Router { get; } = new();

    public ShellViewModel()
    {
        Router.Navigate.Execute(new HomeViewModel(this)).Subscribe();
    }

    public void ShowDetails() =>
        Router.Navigate.Execute(new DetailsViewModel(this)).Subscribe();

    public void GoBack() =>
        Router.NavigateBack.Execute(Unit.Default).Subscribe();
}

public partial class ShellView : ReactiveUserControl<ShellViewModel>
{
    public ShellView()
    {
        this.WhenActivated(disposables =>
            ViewModel!.Router.CurrentViewModel
                .Subscribe(viewModel => contentHost.NavigateTo(viewModel))
                .DisposeWith(disposables));
    }
}

Remarks

Use RoutingState from an IScreen implementation to coordinate navigation in multi-page applications. The stack works in a last-in-first-out fashion, enabling forward navigation via Navigate and back navigation via NavigateBack. Consumers can observe CurrentViewModel or NavigationChanged to drive view presentation.

Constructors

RoutingState(IScheduler?)

Initializes a new instance of the RoutingState class.

[RequiresDynamicCode("RoutingState uses ReactiveCommand which requires dynamic code generation.")]
[RequiresUnreferencedCode("RoutingState uses ReactiveCommand which may require unreferenced code.")]
public RoutingState(IScheduler? scheduler = null)

Parameters

scheduler IScheduler

A scheduler for where to send navigation changes to.

Properties

CurrentViewModel

Gets or sets the observable that yields the currently active view model whenever the navigation stack changes.

[IgnoreDataMember]
[JsonIgnore]
public IObservable<IRoutableViewModel> CurrentViewModel { get; protected set; }

Property Value

IObservable<IRoutableViewModel>

Navigate

Gets or sets a command that adds a new element to the navigation stack. The command argument must implement IRoutableViewModel and the command emits the same instance once scheduling completes.

[IgnoreDataMember]
[JsonIgnore]
public ReactiveCommand<IRoutableViewModel, IRoutableViewModel> Navigate { get; protected set; }

Property Value

ReactiveCommand<IRoutableViewModel, IRoutableViewModel>

NavigateAndReset

Gets or sets a command that replaces the entire navigation stack with the supplied view model, effectively resetting navigation history.

[IgnoreDataMember]
[JsonIgnore]
public ReactiveCommand<IRoutableViewModel, IRoutableViewModel> NavigateAndReset { get; protected set; }

Property Value

ReactiveCommand<IRoutableViewModel, IRoutableViewModel>

NavigateBack

Gets or sets a command which will navigate back to the previous element in the stack and emits the new current view model. The command can only execute when at least two view models exist in the stack.

[IgnoreDataMember]
[JsonIgnore]
public ReactiveCommand<Unit, IRoutableViewModel> NavigateBack { get; protected set; }

Property Value

ReactiveCommand<Unit, IRoutableViewModel>

NavigationChanged

Gets or sets an observable that signals detailed change sets for the navigation stack, enabling reactive views to animate push/pop operations.

[IgnoreDataMember]
[JsonIgnore]
public IObservable<IChangeSet<IRoutableViewModel>> NavigationChanged { get; protected set; }

Property Value

IObservable<IChangeSet<IRoutableViewModel>>

NavigationStack

Gets or sets the current navigation stack, with the last element representing the active view model.

[DataMember]
[JsonRequired]
public ObservableCollection<IRoutableViewModel> NavigationStack { get; set; }

Property Value

ObservableCollection<IRoutableViewModel>