Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Lista de Refeições não apresenta itens. Aula 3.2 Xamarin - Listas e Binding.

Na lista de refeições não aparece nada, fica uma tela branca. Segue códigos.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection.Emit;
using System.Text;


namespace Nutricao.Model
{
    public class Refeicao 
    {
        private String Descricao { get; set; }
        private Double Calorias { get; set; }
        public Refeicao(){}
        public Refeicao(String descricao, Double calorias)
        {
            Descricao = descricao;
            Calorias = calorias;
        }
    }
}
using Nutricao.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Reflection.Emit;
using System.Text;

using Xamarin.Forms;

namespace Nutricao
{
    public class HomeTabbedPage : TabbedPage
    {
        public HomeTabbedPage()
        {
            ObservableCollection<Refeicao> refeicoes = new ObservableCollection<Refeicao>();
            this.Children.Add(new MainPage(refeicoes));
            this.Children.Add(new ListaRefeicoes(refeicoes));
        }
    }
}
<?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="Nutricao.ListaRefeicoes"
             Title="Lista Refeições">

  <ContentPage.Content>

    <StackLayout>
      <ListView ItemsSource="{Binding Refeicoes}">
        <ListView.ItemTemplate>
          <DataTemplate>
            <ViewCell>
              <ViewCell.View>
                <StackLayout>
                  <Label Text="{Binding Descricao}"/>

                  <StackLayout Orientation="Horizontal">
                    <Label Text="Calorias: "/>
                    <Label Text="{Binding Calorias}"/>
                  </StackLayout>

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

  </ContentPage.Content>

</ContentPage>
using Nutricao.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using Xamarin.Forms;

namespace Nutricao
{
    public partial class ListaRefeicoes : ContentPage
    {
        ObservableCollection<Refeicao> Refeicoes { get; set; }
        public ListaRefeicoes(ObservableCollection<Refeicao> refeicoes)
        {
            BindingContext = this;
            Refeicoes = refeicoes;
            InitializeComponent();

        }
    }
}
<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:local="clr-namespace:Nutricao"
             x:Class="Nutricao.MainPage"
             Title="Cadastro de Refeições">
  <StackLayout Padding="25">
    <Label Text="Descrição" />
    <Entry Placeholder="Ex:Salada com carne." x:Name="entDescricao"/>
    <StackLayout>
      <Label Text="Calorias"/>
      <Label x:Name="lblCalorias" Text="0"/>
    </StackLayout>
    <Slider Maximum="1000" Minimum="0" x:Name="sldCalorias" ValueChanged="AtualizaContador"/>
    <Button Text="Salvar" Clicked="SalvarRefeicao"/>
  </StackLayout>

</ContentPage>
using Nutricao.Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;

namespace Nutricao
{
    public partial class MainPage : ContentPage
    {
        ObservableCollection<Refeicao> Refeicoes { get; set; }
        public MainPage(ObservableCollection<Refeicao> refeicoes)
        {
            Refeicoes = refeicoes;
            InitializeComponent();

        }

        public void AtualizaContador(Object sender, EventArgs e)
        {
            double valor = sldCalorias.Value;
            lblCalorias.Text = valor.ToString();
        }

        public void SalvarRefeicao(Object sender, EventArgs e)
        {
            String descricao = entDescricao.Text;
            double valor = sldCalorias.Value;

            Refeicao refeicao = new Refeicao(descricao, valor);
            Refeicoes.Add(refeicao);

            Clear();

            String msg = "A refeição "+ descricao + " de "+ valor +" calorias. Foi salva com sucesso!";
            DisplayAlert("Salvar refeição", msg, "Ok");
        }

        public void Clear()
        {
            sldCalorias.Value = 0;
            lblCalorias.Text = "0";
            entDescricao.Text = "";
        }
    }
}
3 respostas
solução!

Olá, André!

Temos que ter cuidado ao criar as propriedades do modelo que servirão para o Binding com o Xaml.

O que acontece é que as propriedades Descricao e Calorias do model Refeicao estão marcadas como private, e não como public:

        private String Descricao { get; set; }
        private Double Calorias { get; set; }

Como resultado, o binding do XAML não "enxerga" a propriedade, porque ela é privada, ou seja, não pode ser lida por outra classe além de Refeicao!

O correto é:

        public String Descricao { get; private set; }
        public Double Calorias { get; private set; }

Infelizmente temos um problema, porém nem o Visual Studio nem o Xamarin irão lançar uma exceção. Então ficamos no escuro. Portanto, fique de olho, não só nos nomes corretos de propriedades/bindings, maiúsculas/minúsculas e também se as propriedades estão visíveis com public ;-)

Boa sorte e bons estudos!

Opa, valeu a força, boa explicação. Esqueci de colocar public no ObservableCollection também.

Estava assim.

ObservableCollection<Refeicao> Refeicoes { get; set; }

Deveria ser assim.

public ObservableCollection<Refeicao> Refeicoes { get; set; }

Agora tudo Ok, App funcionando :D

Excelente! Sempre às ordens!