首页 > 解决方案 > 来自嵌套类的 Xamarin Picker 绑定

问题描述

我正在调用一个返回嵌套类的 API(下面的示例),并且我正在努力将它们绑定到 Picker。

是否可以将它们的嵌套类按原样绑定到选择器?还是我需要以某种方式将它们添加到 IList?

<Picker Title="Select a Currency" ItemsSource="{Binding CurrencyClass}" ItemDisplayBinding="{Binding currencyName}"/>
class MainPageViewModel : INotifyPropertyChanged
    {
        private Currencies _CurrencyClass;
        public Currencies CurrencyClass 
        { 
            get { return _CurrencyClass;  } 
            set 
            {
                _CurrencyClass = value;
                OnPropertyChanged(); 
            } 
        }
    }

这是他们也被消毒的课程的一部分

public class Currencies
    {

        public class Rootobject
        {
            public Results results { get; set; }
        }

        public class Results
        {
            public XCD XCD { get; set; }
            public EUR EUR { get; set; }

         }
        public class XCD
        {
            public string currencyName { get; set; }
            public string currencySymbol { get; set; }
            public string id { get; set; }
        }

        public class EUR
        {
            public string currencyName { get; set; }
            public string currencySymbol { get; set; }
            public string id { get; set; }

        }
    }

这是我收到的 json 的一部分。

{
"results": {     
     "XCD": {
          "currencyName": "East Caribbean Dollar",
          "currencySymbol": "$",
          "id": "XCD"
     },
     "EUR": {
          "currencyName": "Euro",
          "currencySymbol": "€",
          "id": "EUR"
       }
    }
}

标签: xamarin

解决方案


所以我想出了一个解决我想要实现的目标的方法,这可能不是我问题的直接答案,但它是我问题的解决方案。

我最终只是将 JSON 以不同的方式反序列化为货币列表,然后像往常一样轻松绑定。

    class Currency
{
    public string currencyName { get; set; }
    public string currencySymbol { get; set; }
    public string id { get; set; }
}

以及我如何反序列化它以适应该类,我将 JSON 解析为 JObject,然后对于每个孩子的每个孩子,我将其反序列化为我的 Currency 类。

        List<Currency> cList = new List<Currency>();
        HttpResponseMessage response = await client.GetAsync(urlAPI);
        response.EnsureSuccessStatusCode();
        string responseBody = await response.Content.ReadAsStringAsync();
        JObject jo = JObject.Parse(responseBody);
        var children = jo.SelectToken("results").Children();
        foreach(var child in children)
        {
            var childrenOfChild = child.Children();
            foreach(var c in childrenOfChild)
            {
                cList.Add(JsonConvert.DeserializeObject<Currency>(JsonConvert.SerializeObject(c)));
            }
        }

推荐阅读