ググって出てくるのは大体コードビハインドからNavigation.PushAsyncする方法。
その場合、遷移前にごちゃごちゃした処理がある場合もコードビハインドに書くってことになるの?それってどうなの?
って感じだったのでViewModelから遷移させる方法を考えてみました。
とは言ってもものすごく簡単なので何か落とし穴がありそう。。。
public class MainPageViewModel
{
private INavigation navigation;
public MainPageViewModel(INavigation nav)
{
this.navigation = nav;
this.ScreenTracitionCommand = new Command(() => ScreenTracition());
}
public ICommand ScreenTracitionCommand { get; }
private void ScreenTracition()
{
if(this.navigation != null)
{
navigation.PushAsync(new NextPage());
}
}
}
ViewModelのコンストラクタでNavigationを受け取って変数に保持しておいて画面遷移を実行するイベントでNavigation.PushAsyncするというもの。
この方法で画面遷移と戻るボタンで戻ることはできました。
他のソースはこんな感じになってます。
public App ()
{
InitializeComponent();
MainPage = new NavigationPage(new XF_NavigationPage.MainPage());
}
NavigationPageとして扱うので包んであげます。
<StackLayout Spacing="20" Padding="15">
<Button Text="ViewModelから画面遷移" Command="{Binding ScreenTracitionCommand}"/>
<Button Text="xaml.csから画面遷移" Clicked="Button_Clicked"/>
</StackLayout>
ScreenTracitionCommandはViewModel側で画面遷移させるためのイベントです。
参考までにButton_Clickedでコードビハインドからの画面遷移も実装しました。
public partial class MainPage : ContentPage
{
public MainPage()
{
InitializeComponent();
this.BindingContext = new MainPageViewModel(Navigation);
}
private void Button_Clicked(object sender, EventArgs e)
{
Navigation.PushAsync(new NextPage());
}
}
BindingContextにMainPageViewModelを設定する際、引数にNavigationを渡してあげます。
Button_Clickedはコードビハインドから画面遷移する場合のイベントです。
NextPageはVisualStudioでContentPageを追加したときのデフォルトの状態なので割愛します。
そういえば「空白のページ」を追加すると「InitializeComponentが見つかりません」のエラーが取れませんでした。(「Content Page」を追加で回避)
このエラーが出るとXamarinのバグなのかコーディングミスか分からなくなるのでMSさんには早く治してほしいです。