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

Aula 01 - Atividade 12 - BindingContext não retorna valor

Olá, boa tarde. Estou tentando reproduzir o exemplo da aula 01 - atividade 12 e não estou conseguindo. Vamos por partes. Tudo funciona no código abaixo:

Arquivo MainPage.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"
             xmlns:local="clr-namespace:TestDrive"
             x:Class="TestDrive.MainPage">

    <ListView x:Name="listViewVeiculos">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <ViewCell.View>
                        <Label Text="{Binding Modelo}"></Label>
                    </ViewCell.View>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</ContentPage>

Arquivo MainPage.xaml.cs
namespace TestDrive
{
    public class Veiculo
    {
        public string Modelo { get; set; }
        public double Preco { get; set; }
    }

    public partial class MainPage : ContentPage
    {
        List<Veiculo> Veiculos { get; set; }

        public MainPage()
        {
            InitializeComponent();

            this.Veiculos = new List<Veiculo>
            {
                new Veiculo { Modelo = "Azera V6", Preco = 60000},
                new Veiculo { Modelo = "Fiesta 2.0", Preco = 50000},
                new Veiculo { Modelo = "HB20 S", Preco = 40000}
            };

            listViewVeiculos.ItemsSource = this.Veiculos;
        }
    }
}

O problema ocorre quando eu modifico as duas linhas abaixo:

Arquivo MainPage.xaml
DE
<ListView x:Name="listViewVeiculos">

PARA
<ListView x:Name="listViewVeiculos" ItemsSource="{Binding Veiculos}">


Arquivo MainPage.xaml.cs
DE
listViewVeiculos.ItemsSource = this.Veiculos;

PARA
this.BindingContext = this;

Quando eu modifico as linhas acima, o app não retorna nada, apenas uma tela em branco, sem linhas e sem nada. Estou utilizando Windows 10 com o VisualStudio 2017 Community. Estou utilizando o meu celular como emulador. Asus ZenFone 2 (Asus_Z00AD Android 5.0 - API 21) Obrigado.

3 respostas

Olá, Elias!

Ao final de cada aula dos nossos cursos, existe um link para baixar o projeto final daquela aula. Então para a Aula 01 temos a atividade: Projeto da Aula Atual

https://cursos.alura.com.br/course/xamarin-aplicativos-mobile-com-visual-studio-parte-1/task/22937

Vamos ver como ficou o código daquela aula:

MainPage.xaml.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;

namespace TestDrive
{
    public class Veiculo
    {
        public string nome { get; set; }
        public decimal preco { get; set; }
    }

    public partial class MainPage : ContentPage
    {
        public List<Veiculo> Veiculos { get; set; }

        public MainPage()
        {
            InitializeComponent();

            this.Veiculos = new List<Veiculo>()
            {
                new Veiculo { nome = "Azera V6", preco = 85000 },
                new Veiculo { nome = "Onix 1.6", preco = 35000 },
                new Veiculo { nome = "Fiesta 2.0", preco = 52000 },
                new Veiculo { nome = "C3 1.0", preco = 22000 },
                new Veiculo { nome = "Uno Fire", preco = 11000 },
                new Veiculo { nome = "Sentra 2.0", preco = 53000 },
                new Veiculo { nome = "Astra Sedan", preco = 39000 },
                new Veiculo { nome = "Vectra 2.0 Turbo", preco = 37000 },
                new Veiculo { nome = "Hilux 4x4", preco = 90000 },
                new Veiculo { nome = "Montana Cabine dupla", preco = 57000 },
                new Veiculo { nome = "Outlander 2.4", preco = 99000 },
                new Veiculo { nome = "Brasilia Amarela", preco = 9500 },
                new Veiculo { nome = "Omega Hatch", preco = 8000 }
            };

            this.BindingContext = this;
        }
    }
}

MainPage.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"
             xmlns:local="clr-namespace:TestDrive"
             x:Class="TestDrive.MainPage">

    <StackLayout Padding="25">
        <ListView x:Name="listViewVeiculos" ItemsSource="{Binding Veiculos}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <Label Text="{Binding nome}"></Label>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>

</ContentPage>

Comparando os dois códigos, notei uma diferença importante:

No projeto da aula:

public List<Veiculo> Veiculos { get; set; }

... e no seu código:

List<Veiculo> Veiculos { get; set; }

Veja que no projeto da aula (e na vídeo-aula), a propriedade-alvo do binding é pública, e que no seu código você não definiu a visibilidade, logo ela assume o valor default, ou seja, ela é privada. Como o binding é feito de fora da classe MainPage, essa propriedade se torna invisível para a view.

É imporante saber que o binding do Xamarin é muito complacente (isto é, se não encontrar a propriedade ele não faz nada, mas também não aborta a aplicação), então sempre que esse tipo de situação ocorrer você pode checar o seu código para ver se:

  • a propriedade de binding é pública?
  • está com nome correto?
  • maiúsculas/minúsculas correspondem no binding e no nome da propriedade?
  • o tipo da propriedade está correto?

Boa sorte e bons estudos!

Professor. Boa tarde e obrigado pela atenção. Primeiramente, ao importar o exemplo da aula, vários erros acontecem (nem compila), então, copie do seu exemplo, todo o código, também não funciona. Obrigado.

solução!

Professor, boa tarde. Após insistir muito e depois de muitos testes, avancei um pouco. Se me permite, vou falar minha experiência. Para fazer funcionar tive que fazer os seguintes passos, vai parecer estranho, mas foi como funcionou para mim.

***Ambimente***
Sistema Operacional: Windows 10 
IDE: Visual Studio Community 2017 (pt-br)
Celular: ZenFone 2

***Passos***
Passo 1.
Com o VS aberto, escolher no menu:
Arquivo -> Novo Projeto.

Passo 2.
Na janela que abrir escolher e confirmar:
Modelos -> Visual C# -> Cross-Platform -> Aplicativo Multiplataforma (Xamarin.Forms ou Nativo)

Passo 3.
Na próxima janela escolher e confirmar:
 - Aplicativo em Branco
 - Xamarin.Forms
 - Biblioteca de Classes Portátil (PCL)

Passo 4.
Logo após confirmar as escolhas acima, uma janela solicita dados para um "Novo Projeto Universal do Windows".
Eu não mudei nada e confirmei.

Observação: as vezes é solicitado a configuração para aplicações Apple, eu fechei todas.

Passo 5.
Escolher no menu:
Compilação -> Gerenciador de Configurações...

Passo 6.
Na janela que abrir existe uma opção com o nome "Configuração da solução ativa:" e está setado para Debug.
Mudar para Release
Fechar a janela

Passo 7.
Salvar tudo.

Passo 8.
Fechar a Solução por completo.

Passo 9.
Abrir a Solução.

Passo 10.
Escolher no menu:
Ferramentas -> Gerenciar Pacotes do NuGet -> Gerenciar Pacotes do NuGet para a Solução...

Passo 11.
Na janela que abrir, selecione "Atualizações"

Passo 12.
Procure por "Xamarin.Forms" e atualize, confirmando todas as janelas que forem abertas.

Passo 13.
Salvar tudo.

Passo 14.
Fechar a Solução por completo.

Passo 15.
Abrir a Solução.

Passo 16.
Fazer o exemplo do exercício.

Funcionou