我的母版页是在单独的ContentPage中定义的,它具有自己的ViewModel,该ViewModel可以处理用于导航和换出明细页的命令,但是它不起作用;从母版页VM导航到详细信息页会导致母版页消失。据我了解,您需要从MasterDetailPage VM导航。有什么方法可以将母版页的VM传递给MasterDetailPage VM,还是应该做其他事情?
<MasterDetailPage xmlns="http://xamarin.com/schemas/2014/forms"
x:Class="NGT.Views.MyMasterDetailPage"
xmlns:prism="clr-namespace:Prism.Mvvm;assembly=Prism.Forms"
prism:ViewModelLocator.AutowireViewModel="True"
xmlns:pages="clr-namespace:NGT.Views"
MasterBehavior="Split">
<MasterDetailPage.Master>
<pages:MyMenuPage/>
</MasterDetailPage.Master>
</MasterDetailPage>
和在Master's Page ViewModel(不是MasterDetailPage ViewModel):
public class MyMenuPageViewModel : ChildBaseViewModel, INavigationAware
{
public MyMenuPageViewModel (INavigationService navigationService)
{
this.navigationService = navigationService;
this.ChangeDetailPage = new DelegateCommand(this.OpenDetailPage)
}
public async void OpenDetailPage()
{
await this.NavigationService.NavigateAsync("FAQPage", animated: false);
}
}
现在,每次我想换出详细信息页面并像这样OnPageChanges?.Invoke("Page1");
从MyMenuPageVM调用事件时,我都会创建一个事件,然后我在MasterDetailPage VM上订阅该事件以处理换出详细信息页面。 >
在MyMenuPageVM(母版页):
public delegate void MyEventHandler(string page); public static event MyEventHandler OnPageChanges;
订阅MasterDetailPageVM上的事件和句柄。
public void OnNavigatedTo(INavigationParameters parameters) { MyMenuPageViewModel.OnPageChanges += this.ChangePage; } public async void ChangePage(string page) { switch (page) { case "Page1": await this.navigationService.NavigateAsync("Page1"); break; case "Page2": await this.navigationService.NavigateAsync("Page2"); break; } }
不确定这是正确的事情,但是可以。 :)