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

ListView não vai para a pagina DetalheView após implementar o SelectedItem no XAML

Olá, estou seguindo os passos do Curso de Xamarin. Porém ao desacoplar o meu code behind do XAML ListagemView usando o MessagingCenter, o código não funciona. Ele deveria criar uma nova janela e acioná-la através do PushAsync, como era feito pelo evento ItemTapped. Porém nada acontece, e o item fica simplesmente selecionado, sem mudanças.

Código ListagemView.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"
             xmlns:viewModels="clr-namespace:TestDrive.ViewModels"
             Title="Test Drive"
             x:Class="TestDrive.Views.ListagemView">

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

    <StackLayout Padding="25">
        <ListView x:Name="listViewVeiculos" 
                  ItemsSource="{Binding Veiculos}"
                  SelectedItem="{Binding VeiculoSelecionado, Mode=TwoWay}">
            <ListView.ItemTemplate>
                <DataTemplate>
                    <ViewCell>
                        <ViewCell.View>
                            <Label FontSize="20" 
                                   FormattedText="{Binding VeiculoLabel}"></Label>
                        </ViewCell.View>
                    </ViewCell>
                </DataTemplate>
            </ListView.ItemTemplate>
        </ListView>
    </StackLayout>
</ContentPage>

Código em ListagemView.xaml.cs:

namespace TestDrive.Views
{

    public partial class ListagemView : ContentPage
    {

        public ListagemView()
        {
            InitializeComponent();
            BindingContext = new ListagemViewModel();
        }

        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");
        }
    }
}

Código em ListagemViewModel.cs:

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

        private Veiculo _veiculoSelecionado;
        public Veiculo VeiculoSelecionado
        {
            get { return _veiculoSelecionado; }
            set
            {
                _veiculoSelecionado = value;
                OnPropertyChanged("VeiculoSelecionado");
                MessagingCenter.Send(_veiculoSelecionado, "VeiculoSelecionado");
            }
        }

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

        public event PropertyChangedEventHandler PropertyChanged;

        [NotifyPropertyChangedInvocator]
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
        }
    }
}
3 respostas
solução!

Olá, Bruno

Parece que o problema está nestas 3 linhas:

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

Isso está criando uma nova instância de ListagemViewModel e associando ela como ViewModel da sua View. Remova essas 3 linhas para que o ViewModel seja a instância de ListagemViewModel que está sendo criada lá no code behind.

Muito obrigado!

A gente que agradece sua participação, Bruno!