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;

            }
        }
    }
}

* - Предположим, вы сделали привязку правильно

это не полная реализация, но я надеюсь, что вы поняли общую идею об этом.

Дайте мне знать если я могу помочь вам пройти через это (и извините за ошибку, это не здесь, родной).