MasterDetailPage: принятие чего-то, кроме страницы
Я следую учебник здесь Master-Подробная Страница
один вопрос, который у меня есть:
часть решения вызывает класс элемента следующим образом:
public class MasterPageItem
{
public string Title { get; set; }
public string IconSource { get; set; }
public Type TargetType { get; set; }
}
и в файле Xaml вы называете его так:
<ListView.ItemsSource>
<x:Array Type="{x:Type local:MasterPageItem}">
<local:MasterPageItem Title="Radio" IconSource="hamburger.png" TargetType="{x:Type local:RadioPage}" />
<local:MasterPageItem Title="Item 1" TargetType="{x:Type temp:ContactsPage}" />
<local:MasterPageItem Title="Item 2" TargetType="{x:Type temp:TodoListPage}" />
<local:MasterPageItem Title="Item 3" TargetType="{x:Type temp:ReminderPage}" />
<local:MasterPageItem Title="File 4" TargetType="{}Foodaddy" />
</x:Array>
</ListView.ItemsSource>
то, что я хочу сделать, это "файл 4", а не создание представления, я бы предпочел отправить строку (или лучше перечисление), поэтому я могу вызывать разные функции. Пример: откройте веб-страницу, выйдите из системы и т. д. Как я изменить формат?
1 ответов
если вы заметили в этом фрагменте кода вы увидите, что 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 советы подходит для вас. Вот способ достичь этого:
вы можете создать собственную модель, чтобы заменить 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;
}
}
}
}
* - Предположим, вы сделали привязку правильно
это не полная реализация, но я надеюсь, что вы поняли общую идею об этом.
Дайте мне знать если я могу помочь вам пройти через это (и извините за ошибку, это не здесь, родной).