Mvvm 项目不会出现在ListView Xamarin中。为什么?

Mvvm 项目不会出现在ListView Xamarin中。为什么?,mvvm,xamarin,xamarin.forms,Mvvm,Xamarin,Xamarin.forms,我正在开发一个Xamarin应用程序,并试图在列表中获取JSON项,但这些项不会出现在我的ListView中。 我试着跟随一些教程、视频课程,并试着跟随自己的Xamarin项目,但没有成功 我在这个项目中使用MVVM设计模式 我在写代码,请你告诉我,我忘记在列表上显示那些项目了 ClinicaPage.xaml <?xml version="1.0" encoding="utf-8" ?> <ContentPage xmlns="http://xamarin.com/schem

我正在开发一个Xamarin应用程序,并试图在列表中获取JSON项,但这些项不会出现在我的ListView中。 我试着跟随一些教程、视频课程,并试着跟随自己的Xamarin项目,但没有成功

我在这个项目中使用MVVM设计模式

我在写代码,请你告诉我,我忘记在列表上显示那些项目了

ClinicaPage.xaml

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="CartaoDeTodos.View.ClinicaPage">
    <StackLayout>
      <ListView
                x:Name="ClinicaList"
                ItemsSource="{Binding Clinicas}">
        <ListView.ItemTemplate>
          <DataTemplate>
            <ViewCell>
              <Grid>
                <Grid.Padding>
                  <OnPlatform x:TypeArguments="Thickness">
                    <OnPlatform.iOS>
                      10,5,10,5
                    </OnPlatform.iOS>
                    <OnPlatform.Android>
                      10,5,10,5
                    </OnPlatform.Android>
                    <OnPlatform.WinPhone>
                      20,25,20,25
                    </OnPlatform.WinPhone>
                  </OnPlatform>
                </Grid.Padding>
                <Grid.ColumnDefinitions>
                  <ColumnDefinition Width="Auto"/>
                  <ColumnDefinition Width="*"/>
                </Grid.ColumnDefinitions>
                <StackLayout Grid.Column="1"
                             Padding="8"
                             Spacing="4"
                             VerticalOptions="Center">
                  <Label Text="{Binding Nome}" FontSize="Medium"  TextColor="#3498DB" LineBreakMode="NoWrap"/>
                </StackLayout>
              </Grid>
            </ViewCell>
          </DataTemplate>
        </ListView.ItemTemplate>
      </ListView>
      <Button x:Name="btnVoltar" Text="Voltar" Command="{Binding VoltarCommnad}"></Button>
    </StackLayout>
</ContentPage>
ClinicaViewModel.cs

   public class ClinicaViewModel : ViewModelBase
    {

        private ICommand _voltarCommand;
        public ObservableCollection<Clinica> Clinicas { get; set; }

        public ClinicaViewModel(Page page) : base(page)
        {
            Clinicas = new ObservableCollection<Clinica>();
        }

        private Command getClinicasCommand;
        public Command GetClinicasCommad
        {
            get
            {
                return getClinicasCommand ??
                    (getClinicasCommand = new Command(async () => await ExecuteGetClinicasCommand()));
            }
        }

        private async Task ExecuteGetClinicasCommand()
        {
            var clinicaServico = new ClinicaServico();
            GetClinicasCommad.ChangeCanExecute();
            var clinicas = await clinicaServico.ListagemClinicaAsync();

        }

        public ICommand VoltarCommnad
        {
            get
            {
                return _voltarCommand ?? (_voltarCommand = new Command(() =>
                {
                    page.Navigation.PushModalAsync(new LoginPage());
                }));
            }
        }
    }
JSON


看起来您从未使用从REST调用中获得的项目更新ObservableCollection

private async Task ExecuteGetClinicasCommand()
{
    var clinicaServico = new ClinicaServico();
    GetClinicasCommad.ChangeCanExecute();
    var clinicas = await clinicaServico.ListagemClinicaAsync();

    // Update your observable collection with clinicas here
    foreach (var clinica in clinicas)
        Clinicas.Add(clinica);
}

“var clinicas=wait clinicaServico.ListagemClinicaAsync();”-这会将结果分配给一个局部变量,但实际上您似乎并没有更新公共clinicas属性tanks
foreach(clinicas.Dados中的var clinica)
clinicas.Add(clinica)哦,是的,我忘了您的数据嵌套在另一个对象中。干杯
public class ClinicaServico
    {
        private const string MyChesysApi = "Oculto";

        public async Task<JsonRetornoApi<List<Clinica>>> ListagemClinicaAsync()
        {
            var client = new RestClient(MyChesysApi);
            var request = new RestRequest("/api//Clinica/ClinicasVinculadas", Method.GET);

            string token = (string) Application.Current.Properties["access_token"];
            request.AddHeader("Content-Type", "application/json");
            request.AddHeader("Authorization", "Bearer "+token);

            IRestResponse response = await client.Execute(request);

            var clinicas = JsonConvert.DeserializeObject<JsonRetornoApi<List<Clinica>>>(response.Content);


            if (!response.IsSuccess)
            {
                throw new InfraException("Serviço fora ou não encontrado.");
            }


            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
                throw new RegraNegocioServicoException("Sessão expirada, faça login novamente.");
            }

            return clinicas;
        }
    }
public class JsonRetornoApi<T> where T : class
{
    public JsonRetornoApi()
    {

    }

    public int CodigoRetorno { get; set; }

    public string Mensagem { get; set; }

    public T Dados { get; set; }

}
public class Clinica
    {
        public string Nome { get; set; }

        public double Latitude { get; set; }

        public double Longitude { get; set; }

    }
{"CodigoRetorno":0,"Mensagem":"Sucesso","Dados":[{"Bairro":"Vila Ana Maria","CEP":"14026220","CNES":null,"CNPJCPF":"65625656256256","Complemento":null,"Email":null,"Endereco":"Rua Raul Peixoto","Municipio":"Ribeirão Preto","Nome":"Viper Clinicas","Numero":"630","UF":"SP","HoraInicio":"08:00:00","HoraFim":"20:00:00","Latitude":"-21.2103565","Longitude":"-47.8183606","Codigo":6259,"Excluido":false},{"Bairro":"Centro","CEP":"14015040","CNES":null,"CNPJCPF":"01190190000150","Complemento":null,"Email":null,"Endereco":"Rua São Sebastião","Municipio":"Ribeirão Preto","Nome":"Clínica Independência","Numero":"1442","UF":"SP","HoraInicio":"07:00:00","HoraFim":"21:00:00","Latitude":"-21.1812446","Longitude":"-47.8030487","Codigo":7244,"Excluido":false}]}
private async Task ExecuteGetClinicasCommand()
{
    var clinicaServico = new ClinicaServico();
    GetClinicasCommad.ChangeCanExecute();
    var clinicas = await clinicaServico.ListagemClinicaAsync();

    // Update your observable collection with clinicas here
    foreach (var clinica in clinicas)
        Clinicas.Add(clinica);
}