微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何绑定到 Xamarin MVVM 中的嵌套属性从 JSON 生成

如何解决如何绑定到 Xamarin MVVM 中的嵌套属性从 JSON 生成

我需要一些关于使用 Json2C# 从 JSON 绑定到生成类中的嵌套属性的建议。所以我使用了 firebase 云函数,我得到了一个返回的 json 字符串。我使用该字符串生成以下类。

public class BusinessReturnedModel
{
    // Root myDeserializedClass = JsonConvert.DeserializeObject<Root>(myJsonResponse); 
    public class Longitude
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class Line2
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class City
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class Postcode
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class Line1
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class County
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class Country
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class Fields
    {
        public Line2 line_2 { get; set; }
        public City city { get; set; }
        public Postcode postcode { get; set; }
        public Line1 line_1 { get; set; }
        public County county { get; set; }
        public Country country { get; set; }
    }

    public class MapValue
    {
        public Fields fields { get; set; }
    }

    public class Address
    {
        public MapValue mapValue { get; set; }
        public string valueType { get; set; }
    }

    public class Name
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class ProfilePicture
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class BusinessType
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class Geohash
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class Latitude
    {
        public string stringValue { get; set; }
        public string valueType { get; set; }
    }

    public class FieldsProto
    {
        public Longitude longitude { get; set; }
        public Address address { get; set; }
        public Name name { get; set; }
        public ProfilePicture profile_picture { get; set; }
        public BusinessType business_type { get; set; }
        public Geohash geohash { get; set; }
        public Latitude latitude { get; set; }
    }

    public class Settings
    {
        public string projectId { get; set; }
        public string firebaseVersion { get; set; }
        public string libName { get; set; }
        public string libVersion { get; set; }
    }

    public class Serializer
    {
        public bool allowUndefined { get; set; }
    }

    public class BackoffSettings
    {
        public int initialDelayMs { get; set; }
        public int maxDelayMs { get; set; }
        public double backoffFactor { get; set; }
    }

    public class ActiveClients
    {
    }

    public class FailedClients
    {
    }

    public class Promise
    {
    }

    public class TerminateDeferred
    {
        public Promise promise { get; set; }
    }

    public class ClientPool
    {
        public int concurrentOperationLimit { get; set; }
        public int maxIdleClients { get; set; }
        public ActiveClients activeClients { get; set; }
        public FailedClients FailedClients { get; set; }
        public bool terminated { get; set; }
        public TerminateDeferred terminateDeferred { get; set; }
    }

    public class Firestore
    {
        public Settings _settings { get; set; }
        public bool _settingsFrozen { get; set; }
        public Serializer _serializer { get; set; }
        public string _projectId { get; set; }
        public int registeredListenersCount { get; set; }
        public int bulkWritersCount { get; set; }
        public BackoffSettings _backoffSettings { get; set; }
        public ClientPool _clientPool { get; set; }
    }

    public class Path
    {
        public List<string> segments { get; set; }
        public string projectId { get; set; }
        public string databaseId { get; set; }
    }

    public class Converter
    {
    }

    public class Ref
    {
        public Firestore _firestore { get; set; }
        public Path _path { get; set; }
        public Converter _converter { get; set; }
    }

    public class ReadTime
    {
        public int _seconds { get; set; }
        public int _nanoseconds { get; set; }
    }

    public class CreateTime
    {
        public int _seconds { get; set; }
        public int _nanoseconds { get; set; }
    }

    public class UpdateTime
    {
        public int _seconds { get; set; }
        public int _nanoseconds { get; set; }
    }

    public class BusinessItem
    {
        public FieldsProto _fieldsProto { get; set; }
        public Ref _ref { get; set; }
        public Serializer _serializer { get; set; }
        public ReadTime _readTime { get; set; }
        public CreateTime _createTime { get; set; }
        public UpdateTime _updateTime { get; set; }
    }
}

public class Record
{
    public BusinessReturnedModel record;
}

我想要实现的是绑定到这些属性,下面是我的 XAML。

<ContentPage.Content>

    <StackLayout>

        <CollectionView ItemsSource="{Binding Businesses}"
                    SelectionMode="Single">
        <CollectionView.ItemTemplate>
            <DataTemplate x:DataType="businessReturned:BusinessReturnedModel">
                <Grid Padding="10">
                    <Grid.RowDeFinitions>
                        <RowDeFinition Height="Auto" />
                        <RowDeFinition Height="Auto" />
                    </Grid.RowDeFinitions>
                    <Grid.ColumnDeFinitions>
                        <ColumnDeFinition Width="Auto" />
                        <ColumnDeFinition Width="Auto" />
                    </Grid.ColumnDeFinitions>
                    <Image Grid.RowSpan="2" 
                           Source="{Binding what goes here!!!???}" 
                           Aspect="AspectFill"
                           HeightRequest="60" 
                           WidthRequest="60" />
                    <Label Grid.Column="1" 
                           Text="{Binding}" 
                           FontAttributes="Bold" />
                    <Label Grid.Row="1"
                           Grid.Column="1" 
                           Text="{Binding}"
                           FontAttributes="Italic" 
                           VerticalOptions="End" />
                </Grid>
            </DataTemplate>
        </CollectionView.ItemTemplate>
    </CollectionView>
                    
    </StackLayout>

</ContentPage.Content>
下面是我的视图模型 Searchviewmodel(无论如何都是相关的部分..)
    public ICommand GetNearbyServicesCommand => new Command<List<BusinessItem>>(async (List<BusinessItem> businesses) => { BusinessList = await GetNearbyAsync(); });
    public ObservableCollection<BusinessItem> Businesses { get; set; }

    private List<BusinessItem> _businessList;
    public List<BusinessItem> BusinessList
    {
        get
        {
            return _businessList;
        }
        set
        {
            if (_businessList != value)
            {
                _businessList = value;
                Businesses = new ObservableCollection<BusinessItem>(value);
                OnPropertyChanged();
            }
        }
    }

...//public async Task<List<BusinessItem>> GetNearbyAsync()
//Here is the after http client get etc..
if (response.IsSuccessstatusCode)
        {
            var content = await response.Content.ReadAsstringAsync();

            var myDeserializedClass = JsonConvert.DeserializeObject<List<BusinessItem>>(content);

            Console.WriteLine(myDeserializedClass);

            return myDeserializedClass;

        }
//...

所以问题是,当我尝试绑定到属性时,我不能。我试过 Binding Record.Name、Binding record.Name、Binding FieldsProto.etc... 似乎没有任何效果。我知道我这样做可能完全错误,但是在绑定到 RESTful Web 服务的响应时,我找不到任何关于嵌套属性绑定的文档。请帮忙!!

亲切的问候, 有抱负的阿波罗

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。