MasterDetailPage: принятие чего-то другого, кроме страницы - PullRequest
0 голосов
/ 28 мая 2018

Я следую учебному пособию на Master-Detail Page

У меня один вопрос:

Часть решения требует следующий класс элементов:

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", а не создавать представление, я бывместо этого отправьте строку (или, лучше, Enum), чтобы я мог вызывать различные функции.Пример: открыть веб-страницу, выйти из системы и т. Д. Как изменить TargetType?

1 Ответ

0 голосов
/ 29 мая 2018

Если вы заметите в этом фрагменте кода , вы увидите, что метод 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;

            }
        }
    }
}

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...