Если вы заметите в этом фрагменте кода , вы увидите, что метод OnItemSelected
обрабатывает событие и ожидает MasterPageItem
:
void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
var item = e.SelectedItem as MasterPageItem;
if (item != null) {
Detail = new NavigationPage ((Page)Activator.CreateInstance (item.TargetType));
masterPage.ListView.SelectedItem = null;
IsPresented = false;
}
}
Он делаетнавигация непосредственно через обработчик событий (это не MVVM
способ сделать это).
Я думаю, @ Jason s advice подходит вам.Вот способ достижения этого:
Вы можете создать свою собственную модель, чтобы заменить MasterPageItem
и обрабатывать ее свойства, например, в MasterDetailMenuViewModel
, и изменить обработку так, чтобы она была более точной для ваших нужд.
См. Пример ниже:
Создание удивительной модели для ваших пунктов меню
public class AmazingMenuItem
{
public string ItemName { get; set; }
public string ItemIconSource { get; set; }
public EnumAction ActionType { get; set; }
public object ActionParameter { get; set; }
}
public enum EnumAction
{
OpenPage = 0,
ShowMessage = 1,
PopToRoot = 2
/* ... and so on */
}
Обработка в представлении модели *
public class MenuViewModel : SomeINotifyPropertyChangedImplementation
{
public Command ItemSelectedCommand { get; }
/*
Other properties
*/
public MenuViewModel()
{
ItemSelectedCommand = new Command<AmazingMenuItem>(ExecuteItemSelected);
}
private void ExecuteItemSelected(AmazingMenuItem item)
{
if(item != null)
{
switch(item.ActionType)
{
case EnumAction.OpenPage:
var detail = (App.Current.MainPage as MasterDetailPage).Detail;
if(detail is NavigationPage)
detail.PushAsync((Page)Activator.CreateInstance(item.ActionParameter.GetType()));
else
(App.Current.MainPage as MasterDetailPage).Detail = new NavigationPage((Page)Activator.CreateInstance(item.ActionParameter.GetType()));
break;
case EnumAction.ShowMessage:
App.Current.MainPage.DisplayAlert(item.ActionParameter.ToString(), "Ok", "Cancel");
break;
case EnumAction.PopToRoot:
(App.Current.MainPage as MasterDetailPage)?.Detail.PopToRootAsync();
break;
}
}
}
}
* - Предположим, вы правильно сделали привязки
Это не полная реализация, но я надеюсь, что вы поняли общее представление об этом.
Дайте мне знатьесли я могу помочь вам разобраться с этим (и извините за любую ошибку на английском языке, это не родной язык здесь) .