C# Xamarin从Web API获取数据

C# Xamarin从Web API获取数据,c#,xamarin,C#,Xamarin,我正在尝试在Xamarin做一个简单的应用程序,在那里我可以看到我所在城市的当前天气。但我似乎做得不对。。我从openweathermap.org获得了api,我在url中搜索我所在城市的坐标。 为了获得OpenWeather类的类,我使用json2csharp生成了我的类 我想显示城市名称、天气描述和坐标 我将发布到目前为止获得的代码: MainPage.xaml.cs: public partial class MainPage : ContentPage { public Main

我正在尝试在Xamarin做一个简单的应用程序,在那里我可以看到我所在城市的当前天气。但我似乎做得不对。。我从openweathermap.org获得了api,我在url中搜索我所在城市的坐标。 为了获得OpenWeather类的类,我使用json2csharp生成了我的类

我想显示城市名称、天气描述和坐标

我将发布到目前为止获得的代码:

MainPage.xaml.cs:

public partial class MainPage : ContentPage
{
    public MainPage()
    {
        InitializeComponent();
        GetWeather();

    }

    public async void GetWeather()
    {

        try
        {
            string URL = "http://api.openweathermap.org/data/2.5/weather?lat=58.34&lon=11.94&appid=((((((MY API KEY))))))))))))";

            HttpClient httpClient = new HttpClient();
            HttpResponseMessage response = await httpClient.GetAsync(new Uri(URL));

            if (response.IsSuccessStatusCode)
            {
                var content = await response.Content.ReadAsStringAsync();
                var weatherList = JsonConvert.DeserializeObject<RootObject>(content);

                //Databind the list
                lstWeather.ItemsSource = weatherList;
            }
        }
        catch (Exception ex)
        {
            //ToDo Give errormessage to user and possibly log error
            System.Diagnostics.Debug.WriteLine(ex.ToString());
        }
    }
}
MainPage.xaml:

<ProgressBar IsEnabled="True"></ProgressBar>
<ListView x:Name="lstWeather">
    <ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                    <StackLayout Orientation="Vertical">-->
                        <Label  Text="{Binding name}" />
                        <Label  Text="{Binding desciption}" Margin="20,0,0,0"/>
                        <Label  Text="{Binding lon}" Margin="20,0,0,0"/>
                        <Label  Text="{Binding lat}" Margin="20,0,0,0"/>
                   </StackLayout>
                </StackLayout>
            </ViewCell>
        </DataTemplate>
    </ListView.ItemTemplate>
</ListView>


namespace TestApp
{ 公共类合作社 { 公共双lon{get;set;} 公共双lat{get;set;} }

问题在于:

lstWeather.ItemsSource = weatherList;
weatherList是一个RootObject,但ListView的数据源需要IEnumerable

您可能想这样做:

lstWeather.ItemsSource = weatherList.weather;
我认为这一行需要如下:

var weatherList = JsonConvert.DeserializeObject<List<RootObject>>(content);

无法正确地描述您的问题似乎没有帮助。您具体遇到了什么问题?您遇到了错误还是异常?@Jason噢,对不起!我目前的异常情况出现在MainPage.xaml.cs文件中,错误消息是:无法隐式将类型“TestApp.RootObject”转换为“System.Collections.IEnumerable”。存在显式转换。是否缺少强制转换?我甚至不确定当问题解决后,我的语法是否正确以打印出我想要的内容。这帮助我消除了错误。现在我可以启动应用程序,但它是空的。如果我将鼠标悬停,我可以看到那里有一个listitem。当我在lstWeather.ItemsSource=weat设置断点时herList.weather;我可以看到我想看到的对象。也许我在xaml中的数据绑定是错误的?列表中的每一项都是weather对象,因此您的绑定必须是WeatherWell的属性。不过,我在输出窗口中得到了这一点。那么,数据绑定将如何呢?weather类没有名称属性,但我认为使用这个var weatherList=JsonConvert.DeserializeObjectcontent;我创建了一个包含name?
var weatherList = JsonConvert.DeserializeObject<RootObject>(content);
var weatherList = JsonConvert.DeserializeObject<List<RootObject>>(content);