执行一些操作后,我需要重定向到ViewModel中的另一个页面。我有按钮并设置了命令,但是如果我第一次加载页面,则会收到错误消息“请使用导航页面”,应用程序将失败,我将再次启动并尝试加载页面,并且它可以正常工作,但是如果删除来自模拟器的应用程序,然后再试一次,我有相同的过程。
public ICommand FilterItemsCommand { get; private set; }
public FilterArticlesForPurchaseViewModel()
: base()
{
Task.Run(async () => await LoadAllDataForArticlesAndCategories()).Wait();
FilterItemsCommand = new Command(async () => await FilterItems());
}
private async Task FilterItems()
{
await Application.Current.MainPage.Navigation.PushAsync(new ArticlesForPurchaseFiltered());
}
应用
MainPage = new NavigationPage(GetMainPage());
我也尝试过
Application.Current.MainPage = new NavigationPage(new ArticlesForPurchaseFiltered());
但是随后我无法返回上一页,如果我使用android后退按钮,则应用程序将失败 顺便说一句,我正在使用主要细节
答案 0 :(得分:1)
您可以像下面的代码一样将INavigation navigation
添加到ViewModel的构造函数中。
public ItemsViewModel(INavigation navigation)
{
Title = "Browse";
Items = new ObservableCollection<Item>();
LoadItemsCommand = new Command(async () => await ExecuteLoadItemsCommand());
FilterItemsCommand = new Command(() => { navigation.PushModalAsync(new Page1()); });
MessagingCenter.Subscribe<NewItemPage, Item>(this, "AddItem", async (obj, item) =>
{
var newItem = item as Item;
Items.Add(newItem);
await DataStore.AddItemAsync(newItem);
});
}
绑定视图模型时,可以像下面的代码一样添加属性。
public ItemsPage()
{
InitializeComponent();
BindingContext = viewModel = new ItemsViewModel(Navigation);
}
如果要在viewModel中实现导航,可以使用
// this way you need add `MainPage =new NavigationPage( new MainPage());` in app.xaml.cs
navigation.PushAsync(new Page1());
// this way you do not need `MainPage =new NavigationPage( new MainPage());` in //app.xaml.cs, just used it directly
navigation.PushModalAsync(new Page1());