【问题标题】:Xamarin Shell : Pass multiple arguments to another pageXamarin Shell:将多个参数传递到另一个页面
【发布时间】:2021-02-20 06:00:28
【问题描述】:

我的 Xamarin Forms Shell 应用中有两个页面。 一个列表页面,另一个是详细信息页面。 当我在列表页面中选择项目时,将显示详细信息页面。我能够将一个参数传递到第二页。我知道如何传递第二个值。但是我应该如何在第一个属性本身中接收第二个值。

列表页面:

        async private void myLines_ItemTapped(object sender, ItemTappedEventArgs e)
        {
            var line = (Models.QLines)e.Item;
            int pno = line.PageNo;
            int lno = line.LineNo;
            await Shell.Current.GoToAsync($"//mainTabs/pages?pageno={pno}&lineno={lno}");
        }

详情页:

        public int CurrentPage { get; set; }
        public int CurrentLine { get; set; }
        public bool IsFromSearchPage { get; set; }

        public string PageNo
        {
            set
            {
                CurrentPage = Convert.ToInt32(Uri.UnescapeDataString(value));
                IsFromSearchPage = true;

                LoadPagesAsSingle();
            }
        }

        public string LineNo
        {
            set
            {
                CurrentLine = Convert.ToInt32(Uri.UnescapeDataString(value));
            }
        }

        public MyPages()
        {
            InitializeComponent();

            conn = DependencyService.Get<ISQLiteMyConnection>().GetConnection();

            IsFromSearchPage = false;

            LoadPagesAsSingle();
        }

【问题讨论】:

    标签: c# xaml xamarin xamarin.forms xamarin.forms.shell


    【解决方案1】:

    作为另一种解决方案,您可以通过页面的静态成员传递参数。例如页面可能包含静态 ViewModel 对象,该对象将在页面出现之前被初始化。

        public class ViewModel : ViewModelBase   
        {
            public string Text { get; set; }
            public int Number { get; set; }
        }
    
        public class MyPage : Page
        {
            static ViewModel _viewModel = new ViewModel();
    
            public MyPage() 
            {
                BindingContext = _viewModel;
            }
    
            public static void InitPage(string text, int number)
            {
                _viewModel.Text = text;
                _viewModel.Number = number;
            }
        }
    }
    

    调用者内部的代码

    static async Task GotoPage()
    {
        MyPage.InitPage("Text", 123);
        await Shell.Current.GoToAsync($"//mainTabs/pages");
    }
    

    【讨论】:

    • ViewModel 需要在两个页面之间通用,对吧?
    • 不需要。它是静态对象,仅依赖于 MyPage。所以从另一个页面,例如Page2 你应该调用 MyPage.GotoPage() 它会传递参数并导航到它。
    【解决方案2】:

    https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/navigation#pass-data 中所述,您可以使用QueryProperty 属性在queryID 和目标属性之间进行映射:

    [QueryProperty("Pageno", "pageno")]
    [QueryProperty("Lineno", "lineno")]
    
    public partial class DetailPage: ContentPage
    {
    
            private int _Pageno;
            public int Pageno
            {
                get { return _Pageno; }
                set { _Pageno = value; }
            }
    
            private int _Lineno;
            public int Lineno
            {
                get { return _Lineno; }
                set { _Lineno = value; }
            }
    

    【讨论】:

    • 不清楚“我在第一个属性本身中收到第二个值”是什么意思。
    • 如果你可以使用 QueryProperty,我也不明白为什么要使用 UnescapeDataString,也许我错过了什么。
    • 作为另一种解决方案,您可以通过页面的静态成员传递参数。例如页面可能包含静态 ViewModel 对象,该对象将在页面出现之前进行初始化。
    • @Cfun 我已经在使用QueryProperty。而且我不知道在Property 中调用函数LoadPagesAsSingle() 是否是个好主意。我在构造函数中尝试过,但它不起作用。
    【解决方案3】:

    您可以在detailPage

    中使用参数
    public DetailPage(string val1,string val2)
    {
    
    }
    

    然后在MyPage中调用它

    Navigation.PushAsync(new DetailPage("parameter1","parameter2"));
    

    【讨论】:

      猜你喜欢
      • 2016-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-21
      • 1970-01-01
      • 2011-01-02
      相关资源
      最近更新 更多