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