Xamarin.Froms错误:Models.User无法转换为类型' System.Collections.IEnumerable'

时间:2018-03-06 13:56:13

标签: c# xamarin.forms

我正在使用Xamarin和MVVM模型构建跨平台应用程序。我对当前的问题做了很多研究,但没有找到一个能够帮助我在论坛中解答的答案/线索。所以,我决定分享它并希望得到帮助。我有一个后端服务器,我可以通过访问令牌进行API调用。在我的后端,我创建了一个帐户表,其中包含firstname,lastname,email等行。我在移动应用程序中创建了一个用户视图模型,我可以在其中显示经过验证的用户信息当我调试时,我可以看到我成功获取用户信息但是,我无法将结果绑定到我的视图中,得到此错误:Models.User无法转换为类型' System.Collections.IEnumerable'。我无法弄清楚它是什么。任何帮助将不胜感激。

这是我的ApiService代码,我在那里对后端服务器进行API调用,并通过访问令牌获取用户信息:

public async Task<User> GetUsersAsync(string accessToken)
{
  var client = new HttpClient();
  client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(
  "Bearer", accessToken);

  var json = await client.GetStringAsync(Constants.BaseApiAddress + "api/Account/UserInfo");

  var user = JsonConvert.DeserializeObject<User>(json);

  return user;
}

这是我的UserViewModel,根据访问令牌设置特定用户的api调用

public class UserViewModel : INotifyPropertyChanged
{
  private readonly ApiServices _apiServices = new ApiServices();
  private User _users;

  public User Users
  {
    get => _users;
    set
    {
      _users = value;
      OnPropertyChanged();
    }
  }

  public ICommand GetUserCommand
  {
    get
    {
      return new Command(async () =>
      {
        var accessToken = Settings.AccessToken;
        Users = await _apiServices.GetUsersAsync(accessToken);
        });
      }
    }
}

这是我的用户模型

public class User
{
  [JsonProperty("FirstName")]
  public string FirstName { get; set; }
  [JsonProperty("LastName")]
  public string LastName { get; set; }
  [JsonProperty("Children")]
  public string Children { get; set; }
  [JsonProperty("Email")]
  public string Email { get; set; }
  [JsonProperty("Image")]
  public string Image { get; set; }
}

这是我的UserProfile视图XAML

<ContentPage.BindingContext>
    <viewModels:UserViewModel />
</ContentPage.BindingContext>

<StackLayout Padding="20">


    <ListView ItemsSource="{Binding Users}"
              HasUnevenRows="True">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout Padding="0,10">
                        <Label Style="{StaticResource ProfileNameLabel}" Text="{Binding Email}" />
                        <Label Margin="0,-5" Style="{StaticResource ProfileTagLabel}" Text="{Binding FirstName}" />

                    </StackLayout>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</StackLayout>

后面的UserProfile视图代码

[XamlCompilation(XamlCompilationOptions.Compile)]
public partial class UserProfilePage : ContentPage
{
  UserViewModel usersViewModel;

  public UserProfilePage ()
  {
    InitializeComponent ();
    BindingContext = usersViewModel = new UserViewModel();
  }

  protected override void OnAppearing()
  {
    base.OnAppearing();

    usersViewModel.GetUserCommand.Execute(null);
  }
}

1 个答案:

答案 0 :(得分:1)

ListView用于显示多个项目的列表,其ItemSource必须是IEnumerable(即集合对象)。您的Users对象只是一个项目。您可以Users List<User>只包含一个项目

public List<User> Users

或者您可以使用其他UI元素来显示数据