Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -706,7 +706,7 @@ namespace ReactiveUI
[System.Runtime.Serialization.IgnoreDataMember]
public ReactiveUI.ReactiveCommand<ReactiveUI.IRoutableViewModel, ReactiveUI.IRoutableViewModel> NavigateAndReset { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
public ReactiveUI.ReactiveCommand<System.Reactive.Unit, System.Reactive.Unit> NavigateBack { get; set; }
public ReactiveUI.ReactiveCommand<System.Reactive.Unit, ReactiveUI.IRoutableViewModel?> NavigateBack { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
public System.IObservable<DynamicData.IChangeSet<ReactiveUI.IRoutableViewModel>> NavigationChanged { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -701,7 +701,7 @@ namespace ReactiveUI
[System.Runtime.Serialization.IgnoreDataMember]
public ReactiveUI.ReactiveCommand<ReactiveUI.IRoutableViewModel, ReactiveUI.IRoutableViewModel> NavigateAndReset { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
public ReactiveUI.ReactiveCommand<System.Reactive.Unit, System.Reactive.Unit> NavigateBack { get; set; }
public ReactiveUI.ReactiveCommand<System.Reactive.Unit, ReactiveUI.IRoutableViewModel?> NavigateBack { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
public System.IObservable<DynamicData.IChangeSet<ReactiveUI.IRoutableViewModel>> NavigationChanged { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -699,7 +699,7 @@ namespace ReactiveUI
[System.Runtime.Serialization.IgnoreDataMember]
public ReactiveUI.ReactiveCommand<ReactiveUI.IRoutableViewModel, ReactiveUI.IRoutableViewModel> NavigateAndReset { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
public ReactiveUI.ReactiveCommand<System.Reactive.Unit, System.Reactive.Unit> NavigateBack { get; set; }
public ReactiveUI.ReactiveCommand<System.Reactive.Unit, ReactiveUI.IRoutableViewModel?> NavigateBack { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
public System.IObservable<DynamicData.IChangeSet<ReactiveUI.IRoutableViewModel>> NavigationChanged { get; set; }
[System.Runtime.Serialization.IgnoreDataMember]
Expand Down
40 changes: 34 additions & 6 deletions src/ReactiveUI.Tests/Routing/RoutingStateTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -34,29 +34,57 @@ public async Task NavigationPushPopTest()
Assert.Equal(2, fixture.NavigationStack.Count);
Assert.True(await fixture.NavigateBack.CanExecute.FirstAsync());

await fixture.NavigateBack.Execute();

var navigatedTo = await fixture.NavigateBack.Execute();
Assert.Equal(navigatedTo.GetType(), input.GetType());
Assert.Equal(1, fixture.NavigationStack.Count);
}

[Fact]
public void CurrentViewModelObservableIsAccurate()
public async Task CurrentViewModelObservableIsAccurate()
{
var fixture = new RoutingState();
fixture.CurrentViewModel.ToObservableChangeSet(ImmediateScheduler.Instance).Bind(out var output).Subscribe();

Assert.Equal(1, output.Count);

fixture.Navigate.Execute(new TestViewModel { SomeProp = "A" });
await fixture.Navigate.Execute(new TestViewModel { SomeProp = "A" });
Assert.Equal(2, output.Count);

fixture.Navigate.Execute(new TestViewModel { SomeProp = "B" });
await fixture.Navigate.Execute(new TestViewModel { SomeProp = "B" });
Assert.Equal(3, output.Count);
Assert.Equal("B", (output.Last() as TestViewModel)?.SomeProp);

fixture.NavigateBack.Execute();
var navigatedTo = await fixture.NavigateBack.Execute();
Assert.Equal(navigatedTo?.GetType(), output.Last()?.GetType());
Assert.Equal(4, output.Count);
Assert.Equal("A", (output.Last() as TestViewModel)?.SomeProp);
Assert.Equal((navigatedTo as TestViewModel)?.SomeProp, (output.Last() as TestViewModel)?.SomeProp);

await fixture.Navigate.Execute(new TestViewModel { SomeProp = "B" });
Assert.Equal(5, output.Count);
Assert.Equal("B", (output.Last() as TestViewModel)?.SomeProp);

await fixture.Navigate.Execute(new TestViewModel { SomeProp = "C" });
Assert.Equal(6, output.Count);
Assert.Equal("C", (output.Last() as TestViewModel)?.SomeProp);

navigatedTo = await fixture.NavigateBack.Execute();
Assert.Equal(navigatedTo?.GetType(), output.Last()?.GetType());
Assert.Equal(7, output.Count);
Assert.Equal("B", (output.Last() as TestViewModel)?.SomeProp);
Assert.Equal((navigatedTo as TestViewModel)?.SomeProp, (output.Last() as TestViewModel)?.SomeProp);

navigatedTo = await fixture.NavigateBack.Execute();
Assert.Equal(navigatedTo?.GetType(), output.Last()?.GetType());
Assert.Equal(8, output.Count);
Assert.Equal("A", (output.Last() as TestViewModel)?.SomeProp);
Assert.Equal((navigatedTo as TestViewModel)?.SomeProp, (output.Last() as TestViewModel)?.SomeProp);

navigatedTo = await fixture.NavigateBack.Execute();
Assert.Equal(navigatedTo?.GetType(), output.Last()?.GetType());
Assert.Equal(9, output.Count);
Assert.Equal(null, (output.Last() as TestViewModel)?.SomeProp);
Assert.Equal(null, (navigatedTo as TestViewModel)?.SomeProp);
}

[Fact]
Expand Down
2 changes: 1 addition & 1 deletion src/ReactiveUI.XamForms.Tests/Mocks/NavigationViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,6 @@ public IObservable<IRoutableViewModel> NavigateAndResetToChild(string value)
/// Navigates back.
/// </summary>
/// <returns>An observable.</returns>
public IObservable<Unit> NavigateBack() => Router.NavigateBack.Execute();
public IObservable<IRoutableViewModel?> NavigateBack() => Router.NavigateBack.Execute();
}
}
6 changes: 3 additions & 3 deletions src/ReactiveUI/Routing/RoutingState.cs
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ public IScheduler Scheduler
/// Gets or sets a command which will navigate back to the previous element in the stack.
/// </summary>
[IgnoreDataMember]
public ReactiveCommand<Unit, Unit> NavigateBack { get; protected set; }
public ReactiveCommand<Unit, IRoutableViewModel?> NavigateBack { get; protected set; }

/// <summary>
/// Gets or sets a command that navigates to the a new element in the stack - the Execute parameter
Expand Down Expand Up @@ -122,11 +122,11 @@ private void SetupRx()

var countAsBehavior = Observable.Defer(() => Observable.Return(NavigationStack.Count)).Concat(NavigationChanged.CountChanged().Select(_ => NavigationStack.Count));
NavigateBack =
ReactiveCommand.CreateFromObservable(
ReactiveCommand.CreateFromObservable<IRoutableViewModel?>(
() =>
{
_navigationStack.RemoveAt(NavigationStack.Count - 1);
return Observables.Unit;
return Observable.Return(NavigationStack.Count > 0 ? _navigationStack[NavigationStack.Count - 1] : default);
},
countAsBehavior.Select(x => x > 1),
navigateScheduler);
Expand Down