代码之家  ›  专栏  ›  技术社区  ›  Gary H

在Xamarin表单之间传递具有list属性的数据,并循环该列表以构建网格

  •  0
  • Gary H  · 技术社区  · 3 年前

    我有一个Xamarin应用程序,它在一个页面上只显示多个报告的标题信息。这些报告有一组标准的固定细线,可以在选中时显示,但在检索数据之前,应用程序不知道有多少细线或哪些细线。当点击Overview表单时,该类被序列化(JsonConvert)为字符串,然后在ViewModel中反序列化为Details表单。详细信息页面是一个XAML页面,但内容是用C语言构建的,因为需要检查每个详细信息行(foreach循环),以确定如何构建该行。我的问题是,一旦对象被传递到details表单,我就不知道如何在列表中循环。 模型类

        public class TrackWarrant : Form
        {
            public string IssuedTo { get; set; }
            public string AtLocation { get; set; }
            public string AuthorityDirection { get; set; }
            public string ProceedFrom { get; set; }
            public string ProceedTo { get; set; }
            public string FormDate { get; set; }
            public string OKTime { get; set; }
            public List<KeyValuePair<int, string>> TWLines { get; set; }
     
        }
    
        public class TWLines
        {
            public int FormNo;
            public string LineNo;
        }
    

    如何序列化数据并将其从标题页传递到详细信息页

            async void TrackWarrant_Tapped(object sender, EventArgs e)
            {
                var ea = e as TappedEventArgs;
                if (ea.Parameter != null)
                {
                    var forminfo = JsonConvert.SerializeObject(ea.Parameter);
                    await Shell.Current.GoToAsync($"trackwarrantinfo?Content={forminfo}");
    }
    

    这就是我的ViewModel对传递的数据所做的

        [QueryProperty(nameof(Content), nameof(Content))]
        internal class TrackWarrantViewModel :BaseViewModel
        {
            string content = "";
            public string Content
            {
                get => content;
                set
                {
                    content = Uri.UnescapeDataString(value ?? string.Empty);
                    OnPropertyChanged();
                    PopulateForm(content);
                }
            }
            private TrackWarrant trackwarrant { get; set; }
            public TrackWarrant TrackWarrantInfo
            {
                get => trackwarrant;
                set
                {
                    trackwarrant = value;
                    OnPropertyChanged("TrackWarrantInfo");
                }
            }
    
            private void PopulateForm(string getcont)
            {
                var content = JsonConvert.DeserializeObject<TrackWarrant>(getcont);
                TrackWarrantInfo = content;
            }
    
        }
    

    在我的详细信息页面代码背后,我可以提取数据;这样显示:trackquirts是我公开的类,FormNumber是一个属性,例如上面的我的模型。

                var lblFormNo = new Label
                {
                    FontSize = Device.GetNamedSize(NamedSize.Medium, typeof(Label)),
                    FontAttributes = FontAttributes.Bold,
                    Margin = new Thickness(5, 0, 0, 0),
                };
                lblFormNo.SetBinding(Label.TextProperty, "TrackWarrantInfo.FormNumber");
    

    我甚至可以从列表中提取数据,如下所示:

                lblTWLine.SetBinding(Label.TextProperty, "TrackWarrantInfo.TWLines[0].Key");
    

    但我不知道有多少行,我真正想做的是在我的网格中构建行(我的内容的基础),通过循环检查每一行细节行,然后显示这些细节。 我在网上搜索了两天,结果一无所获。 提前谢谢。

    1 回复  |  直到 3 年前
        1
  •  1
  •   Jason    3 年前

    TWLines 是一个 List<KeyValuePair<int,string>> 因此,您应该能够使用 foreach

    foreach(var line in TWLines)
    {
      var key = line.Key;
      var value = line.Value;
    }
    
        2
  •  0
  •   Gary H    3 年前

    我在解决方案上犯了错误。最初,我将JSON字符串发送到表单的ViewModel,然后我将其更改为直接发送到表单。我在viewModel中显示的代码,[QueryProperty(nameof(Content),nameof(Content))],后续代码,我在表单的CodeBehind中输入。在构建表单内容时,我可以循环查看详细数据,并确定如何构建网格以供显示。