4
respostas

"SelectedItem" não Funciona

Meu SelectedItem não está funcionando. O comando não chega no ListagemViewModel quando clico em em algum item da tela. Baixei o projeto do professor e está acontecendo a mesma coisa. O que pode ser?

Segue meu código 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:XamarinCapitulo1"
             xmlns:vm="clr-namespace:XamarinCapitulo1.ViewModels"
             x:Class="XamarinCapitulo1.Views.ListagemView"
             Title="Teste Drive">

    <ContentPage.BindingContext>
        <vm:ListagemViewModel></vm:ListagemViewModel>
    </ContentPage.BindingContext>

    <ListView x:Name="listViewVeiculos" ItemsSource="{Binding Veiculos}" Margin="25" SelectedItem="{Binding VeiculoSelecionado}">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <ViewCell.View>
                        <StackLayout Orientation="Horizontal">
                            <Label Text="{Binding Nome}" FontSize="20" VerticalTextAlignment="Center"></Label>
                            <Label Text=" - " VerticalTextAlignment="Center"></Label>
                            <Label Text="{Binding PrecoFormatado}" FontAttributes="Bold" VerticalTextAlignment="Center"></Label>
                        </StackLayout>
                    </ViewCell.View>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</ContentPage>

Code behind:

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

namespace XamarinCapitulo1.Views
{

    public partial class ListagemView : ContentPage
    {
        public ListagemView()
        {
            InitializeComponent();

            //this.BindingContext = this;
        }

        protected override void OnAppearing()
        {
            base.OnAppearing();
            MessagingCenter.Subscribe<Veiculo>(this, "VeiculoSelecionado",
                (msg) =>
                {
                    Navigation.PushAsync(new DetalheView(msg));
                });
        }

        protected override void OnDisappearing()
        {
            base.OnDisappearing();
            MessagingCenter.Unsubscribe<Veiculo>(this, "VeiculoSelecionado");
        }
    }
}

ViewModel

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

namespace XamarinCapitulo1.ViewModels
{
    public class ListagemViewModel
    {
        public List<Veiculo> Veiculos { get; set; }

        Veiculo veiculoSelecionado;

        public Veiculo VeiculoSelecionado
        {
            get
            {
                return veiculoSelecionado;
            }
            set
            {
                veiculoSelecionado = value;

                if (value != null)
                {
                    MessagingCenter.Send(veiculoSelecionado, "VeiculoSelecionado");
                }
            }
        }

        public ListagemViewModel()
        {
            this.Veiculos = new ListagemVeiculos().Veiculos;
        }
    }
}
4 respostas

Pelo que percebi estava faltando fazer o Binding da view com a viewModel.

Também estou com o mesmo problema.

Luis, meu binding foi feito exatamente como o código da postagem. Você poderia me informar o que tá faltando ali?

Depois que clico em um veiculo da listagem não estou indo pra próxima página.

Devido eu está emulando o app pela wifi via Xamarin Live Player não consigo usar o debugger.

Obrigado.

Percebi uma coisa. Eu consigo clicar na lista quando executo o projeto pelo emulador do android no pc. O erro é apenas quando eu vou emular pelo meu celular que aí eu tenho que utilizar o touch do aparelho. Alguém sabe como resolver?

Gregori, o erro é esse mesmo. No Live Player a função não funciona, mas no emulador dentro do VS funciona normalmente.

Não sei na sua máquina, mas o compilar direto pelo emulador de dentro do VS é inviável. Muito lento. Resolvi compilando diretamente pelo celular, habilitei o modo desenvolvedor no celular e habilitei a opção de depurar por cabo USB. Assim eu conecto o celular no computador por usb e aparece a opção de compilar direto por ele no VS. Dessa forma a função funciona normalmente e é bem mais rápido que compilar pelo emulador.