在 Xamarin 中动态添加入口控件

Posted

技术标签:

【中文标题】在 Xamarin 中动态添加入口控件【英文标题】:Dynamically add entry control in Xamarin 【发布时间】:2021-08-01 12:09:22 【问题描述】:

我想从 API 中获取 XML Entry Control,在 JSON 中可用。

Entry 控件的所有属性都在 JSON 中。我想将它们添加到.xml 页面并在ViewModel(通过数据绑定)中获取它们的值(当用户进入应用程序时)。

更新

根据答案更新代码。

public partial class FormPage : ContentPage, IRootView

    public List<Form> forms  get; set; 

    public class RootObject
    
        public bool success  get; set; 
        public Datum[] data  get; set; 
    

    public class Datum
    
        public Form[] form  get; set; 
    

    public class Form
    
        public string label  get; set; 
        public string name  get; set; 
        public string type  get; set; 
        public int max_length  get; set; 
        public bool required  get; set; 
    

    public FormPage()
    
        InitializeComponent();

        var json = @;

        var list = JsonConvert.DeserializeObject<RootObject>(json);

        forms = new List<Form>();
        forms = list.data.FirstOrDefault().form.ToList();

        this.BindingContext = this;
    

【问题讨论】:

很高兴听到您想做什么,但您明确的问题是什么?到目前为止,您为实现目标做了哪些努力? 【参考方案1】:

反序列化 Json: 从 NuGet 安装 Newtonsoft.Json

将 json 转换为类,然后获取 json 数据列表。

在你的VS中,编辑>选择性粘贴>将JSON粘贴为类

 public class Rootobject

    public bool success  get; set; 
    public Datum[] data  get; set; 


public class Datum

    public Form[] form  get; set; 


public class Form

    public string label  get; set; 
    public string name  get; set; 
    public string type  get; set; 
    public int max_length  get; set; 
    public bool required  get; set; 

反序列化获取列表:

   var list = JsonConvert.DeserializeObject<Rootobject>(json);

使用StackLayout的Bindablelayout.ItemTemplate设置Entry的模板:

Xaml:

 <StackLayout x:Name="DynamicEntry" BindableLayout.ItemsSource="Binding forms">
        <BindableLayout.ItemTemplate>
            <DataTemplate>
                <Entry Placeholder="Binding label" MaxLength="Binding max_length" />

            </DataTemplate>
        </BindableLayout.ItemTemplate>
    </StackLayout>

后面的代码:

 public List<Form> forms  get; set; 
    public Page1()
    
        InitializeComponent();

        var json = @"
'success': 'true',
'data': [
    
        'form': [
            
                'label': 'Name',
                'name': 'name',
                'type': 'text',
                'max_length': '15',
                'required': 'true'
            ,
            
                'label': 'Email',
                'name': 'email',
                'type': 'email',
                'max_length': '30',
                'required': 'true'
            
        ]
    
]
";
        var list = JsonConvert.DeserializeObject<Rootobject>(json);

        forms = new List<Form>();
        forms = list.data.FirstOrDefault().form.ToList();

        this.BindingContext = this;
    

请注意,如果您想设置不同类型的 Kayboard,您需要将列表转换为 Keyboard 类。

【讨论】:

感谢您的回复,但有一件事,您为什么要使用var json.. 我想从服务器获得这个“json”响应(它是动态的) 我没有服务器来获取json 响应。所以我直接使用json字符串作为参考。 大声笑.. 真的很抱歉.. 是的,现在,我使用你的代码并编译它,我收到了这个错误Autofac.Core.DependencyResolutionException: 'An exception was thrown while activating Mobile.App.Views.Form.FormPage.' 哪一行代码抛出了错误?下断点一步步调试。 我在每一行都添加了断点,当打开页面并调用InitializeComponent();时,它会返回此错误..

以上是关于在 Xamarin 中动态添加入口控件的主要内容,如果未能解决你的问题,请参考以下文章

蒙面的入口控件 Xamarin.forms

MFC如何动态添加控件

Xamarin Forms,在运行时在 CarouselView 中动态添加项目,奇怪的行为

c# 中如何在GroupBox控件中动态添加与移除控件

C# WinForm 自定义控件如何实现动态添加子控件

求教 C#窗体中动态添加了Panel,再如何动态的在Panel中添加文本框控件呢?