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

EntrarCommand não funciona.Botão não faz nenhuma validação.

Estou com problemas no Command. Quando abro o aplicativo, o botão não desabilita quando os campos estão sem preenchimento e também não valida quando os dados corretos são inseridos.Resultado: o app nunca sai da tela de login. Já tentei de tudo: usar o OnPropertyChanged() e fazer o LoginViewModel herdar de BaseViewModel.Já recriei o LoginViewModel.cs, já recriei a classe LoginView.xaml e não funcionou.Lembrando que não uso o Emulador Android_Accelerated_86_Oreo e nenhum outro Emulador do Visual Studio porque nenhum deles roda. Inclusive testei em máquinas melhores que a minha, e mesmo assim as aplicações não abrem.Por isso eu uso o meu celular Moto One com Android 9.O meu Visual Studio é o 2017 versão 15.9.10.Aqui abaixo estão os códigos do LoginView.xaml e do LoginViewModel :

LoginView.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:vm="clr-namespace:TestDrive.View_Models"
         x:Class="TestDrive.Views.LoginView">

Continuação do LoginView.xaml:

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

<StackLayout VerticalOptions="Center" Margin="64">
        <Image Source="aluracar.png"></Image>
        <Entry Placeholder="Usuário" Text="{Binding Usuario}"></Entry>
    <Entry Placeholder="Senha" IsPassword="True" Text="{Binding Senha}"></Entry>
    <Button Text="Entrar" Command="Binding EntrarCommand"></Button>
</StackLayout>

LoginViewModel.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;
using TestDrive.Models;
using Xamarin.Forms;

namespace TestDrive.View_Models
{
    public class LoginViewModel : BaseViewModel
    {
        private string usuario; 
        public string Usuario
        {
            get { return usuario; }
            set {
                usuario = value;
                OnPropertyChanged();
                ((Command)EntrarCommand).ChangeCanExecute();
            }
        }

    private string senha;
    public string Senha
    {
        get { return senha; }
        set {
            senha = value;
            OnPropertyChanged();
            ((Command)EntrarCommand).ChangeCanExecute();
        }
    }

    public ICommand EntrarCommand { get; private set; }

    public LoginViewModel()
    {
        EntrarCommand = new Command(async () =>
        {

            var loginService = new LoginService();
            await loginService.FazerLogin(new Login(usuario, senha));
        }, () =>
        {
            return string.IsNullOrEmpty(usuario)
                    && !string.IsNullOrEmpty(senha);
        });
    }


}

}

2 respostas
solução!

Oi Antonio, tudo bem?

Ficou faltando um operador ! no retorno da expressão lambda:

Em vez de:

            return string.IsNullOrEmpty(usuario)
                    && !string.IsNullOrEmpty(senha);

o correto é

                return !string.IsNullOrEmpty(usuario)
                        && !string.IsNullOrEmpty(senha);

Obrigado.Na verdade além desse problema, tinha outro: o Visual Studio não corrigia e não compilava mais a classe LoginViewModel.Tive que baixar o projeto da parte 1 do Curso de Xamarin 3 e excluir o antigo, depois disso funcionou.