MasterDetailPage:接受除页面之外的其他内容

时间:2018-05-28 17:00:39

标签: xamarin xamarin.forms

我在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”,而不是创建视图,我宁愿发送一个字符串,(或更好的枚举),所以我可以调用不同的函数。示例:打开网页,注销等。如何修改TargetType?

1 个答案:

答案 0 :(得分:6)

If you notice in this piece of code您会看到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&#39; 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;

            }
        }
    }
}

* - 假设您已正确地进行了绑定

这不是一个完整的实现,但我希望你已经找到了它的一般概念。

如果我可以帮助您通过此(并对任何英语错误表示抱歉,此处不是本地人),请告诉我。