Xamarin 表单:如何将具有参数的内容页添加到列表中?

Xamarin forms: How to add a contentpage having arguments into a list?

我正在我的项目中实施 Navigation Drawer。我正在关注此功能blog

Mainpage.xsml.cs:

public partial class NavigationDrawerPage : MasterDetailPage
    {
public List<MasterPageItem> menuList { get; set; }
        public MainPage()
        {
            InitializeComponent();

            menuList = new List<MasterPageItem>();

            // Adding menu items to menuList and you can define title ,page and icon
            menuList.Add(new MasterPageItem() { Title = "Home", Icon = "home.png", TargetType = typeof(HomePage) });
            menuList.Add(new MasterPageItem() { Title = "Setting", Icon = "setting.png", TargetType = typeof(SettingPage) });
            menuList.Add(new MasterPageItem() { Title = "LogOut", Icon = "logout.png", TargetType = typeof(LogoutPage) });

            navigationDrawerList.ItemsSource = menuList;

            Detail = new NavigationPage((Page)Activator.CreateInstance(typeof(HomePage)));
        }
}

Mainpage.xaml

<StackLayout Grid.Row="1" Spacing="15">
                    <ListView x:Name="navigationDrawerList"
                  RowHeight="60"
                  SeparatorVisibility="None"
                  BackgroundColor="#e8e8e8"
                  ItemSelected="OnMenuItemSelected">

                        <ListView.ItemTemplate>
                            <DataTemplate>
                                <ViewCell>
                                    <StackLayout>
                                        <!-- Main design for our menu items -->
                                        <StackLayout VerticalOptions="FillAndExpand"
                             Orientation="Horizontal"
                             Padding="20,10,0,10"
                             Spacing="20">

                                            <Image Source="{Binding Icon}"
                         WidthRequest="30"
                         HeightRequest="30"
                         VerticalOptions="Center" />

                                            <Label Text="{Binding Title}"
                         FontSize="Medium"
                         VerticalOptions="Center"
                         TextColor="Black"/>
                                        </StackLayout>
                                        <BoxView HeightRequest="1" BackgroundColor="Gray"/>
                                    </StackLayout>
                                </ViewCell>
                            </DataTemplate>
                        </ListView.ItemTemplate>
                    </ListView>
                </StackLayout>

MasterPageItem.cs

public class MasterPageItem
    {
        public string Title { get; set; }
        public string Icon { get; set; }
        public Type TargetType { get; set; }
    }

我的问题是在将我的内容页面添加到列表时。上面的代码工作完美:

menuList.Add(new MasterPageItem() { Title = "Home", Icon = "home.png", TargetType = typeof(SettingPage) });

但是我有一个页面只有一个参数,我无法在 TargetType 中添加参数。请看下面的代码:

menuList.Add(new MasterPageItem() { Title = "Help", Icon = "help.png", TargetType = typeof(HelpPage(false)) });  //showing syntax errors for this line

如何将带有参数的内容页面添加到列表项中?我应该更改 TargetType datatype 吗?

您可以使用 public static object CreateInstance(Type type, params object[] args);

方法传递参数

项目

public class MasterPageItem
{
    public string Title { get; set; }
    public string Icon { get; set; }
    public Type TargetType { get; set; }

    public object[] args { get; set; }   //
}

MasterDetailPage

menuList.Add(new MasterPageItem() { Title = "Home", Icon = "home.png", TargetType = typeof(HomePage), args = new object[] {"string", 1 , false} } ); // pass parameters whatever you want

private void OnMenuItemSelected(object sender, SelectedItemChangedEventArgs e)
{
    var item = (MasterPageItem)e.SelectedItem;
    Type page = item.TargetType;
    Detail = new NavigationPage((Page)Activator.CreateInstance(page,item.args));   //this line
    IsPresented = false;
}

添加相应参数的构造函数

public HomePage()   //remain the default constructor 
{
    InitializeComponent();
}

public HomePage (string s , int i , bool b)   //add this
{
    InitializeComponent ();
}