Saya ingin mengambil XML Entry Control dari API, tersedia di JSON.

Semua atribut untuk kontrol Entri ada di JSON. Saya ingin menambahkannya di halaman .xml dan mendapatkan nilainya (ketika pengguna masuk ke aplikasi) di ViewModel (melalui pengikatan data).

PERBARUI

Perbarui Kode sesuai dengan jawabannya.

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
Stavrogin 11 Mei 2021, 09:16

1 menjawab

Jawaban Terbaik

Deserialize Json: Instal Newtonsoft.Json dari NuGet.

Konversi json ke kelas dan kemudian dapatkan daftar data json.

Di VS Anda, Edit> Tempel Spesial> Tempel JSON Sebagai Kelas

 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; }
}

Deserialisasi untuk mendapatkan daftar:

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

Gunakan Bindablelayout.ItemTemplate dari StackLayout untuk menyiapkan template Entri:

Xaml:

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

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

Kode di belakang:

 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;
    }

enter image description here

Harap dicatat jika Anda ingin mengatur Papan Ketik dengan tipe yang berbeda, Anda perlu mengonversi daftar dengan kelas Papan Ketik.

2
Wendy Zang - MSFT 11 Mei 2021, 08:20