Botão Command não funciona dentro da ListView Xamarin Forms MVVM – c# listview xamarin
Pergunta:
Estou tentando criar um botão com o evento Command dentro de uma ListView em MVVM, porém não está caindo no evento na ViewModel.
Como faço para que esse botão Command acesse seu método na ViewModel ?
E também, como faço para pegar o valor da Label “lblCEP” nesse evento Command para poder passar para outra view ?
Meu código:
/// XAML
<ListView x:Name="lvEnderecos" RowHeight="205">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Label x:Name="lblCEP" Font="14" TextColor="Black" Text="{Binding CliEndCep, StringFormat='CEP: {0}'}"></Label>
<Grid x:Name="GridControl3" RowSpacing="0" ColumnSpacing="0">
<Grid.RowDefinitions>
<RowDefinition Height="25"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<StackLayout x:Name="stkManipularEndereco" Grid.Row="0" Grid.Column="0" Padding="5, 0, 0, 0" HeightRequest="25" WidthRequest="25">
<Button x:Name="btnEditarEndereco" BackgroundColor="Transparent" Image="editar2.png" HeightRequest="25" WidthRequest="25" Command="{Binding EditarEnderecoCommand}" />
</StackLayout>
</Grid>
</StackLayout>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
/// ViewModel
public ICommand EditarEnderecoCommand { get; protected set; }
this.EditarEnderecoCommand = new Command(async () =>
{
try
{
await page.DisplayAlert("Alerta", "Você clicou aqui :)", "OK");
}
catch (Exception ex)
{
throw ex;
}
});
Autor da pergunta AndreeH
Resposta rubStackOverflow:
Na verdade, se a configuração MVVM estiver correto, está funcionando sim.
Porém no comportamento é disparado não na vm e sim na classe que está sendo listada.
Ex: Se sua listviewestá sendo preenchida por List<Endereco> o botão vai ‘disparar’ a ação dentro da classe Endereco
Conheço duas formas de resolver isso, a primeira o ICommand dentro da sua classe.
A segunda é utilizar um este componente https://www.nuget.org/packages/Corcav.Behaviors/
Blogue com exemplo: http://codeworks.it/blog/?p=216
<Button Text="{Binding NickName}">
<b:Interaction.Behaviors>
<b:BehaviorCollection>
<b:EventToCommand CommandNameContext="{b:RelativeContext MainPage}"
EventName="Clicked"
CommandName="NickSelectedCommand"
CommandParameter="{Binding NickName}" />
</b:BehaviorCollection>
</b:Interaction.Behaviors>
</Button>
A propriedade {b:RelativeContext MainPage} informa que a vm definida para esta view (MainPage) será o ‘BindingContext’. Dessa forma, o comando do botão será disparado na vm MainPageViewModel.
É importante definir o nome da view x:Name="MainPage"> para que tudo funcione corretamente.
Para pegar o valor do cep e passar como parâmetro utilize a propriedade CommandParameter
Utilizo uma abordagem diferente da sua, mas pelo que pesquiseis (https://developer.xamarin.com/guides/xamarin-forms/xaml/xaml-basics/data_bindings_to_mvvm/) acredito que o código para pegar o parâmetro seria assim:
this.EditarEnderecoCommand = new Command<string>((parametro) =>
{
});
Achei outra forma de fazer que no meu caso funcionou, porém só se for para fazer funcionar o evento Command sem usar o CommandParameter.
Adicionei BindingContext="{Binding Source={x:Reference lvEnderecos}, Path=BindingContext}"referenciando o nome da minha ListView.
Então ficou assim:
<Button x:Name="btnEditarEndereco" BackgroundColor="Transparent" Image="editar2.png" HeightRequest="25" WidthRequest="25" BindingContext="{Binding Source={x:Reference lvEnderecos}, Path=BindingContext}" Command="{Binding EditarEnderecoCommand}"/>
Se for para funcionar os dois, tanto o Command como o CommandParameter, eu achei a solução e respondi nessa minha outra pergunta: Passar e pegar o CommandParameter de um botão Xamarin Forms



