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

Propriedade Confirmado só dá false

Olá, estou com problemas na hora de fazer o Binding Confirmado. Apesar de funcionar na hora de avisar o usuário se foi feito o agendamento com sucesso, estranhamente na hora de fazer o Binding, ele só retorna False, mesmo que tenha dado True. O que estou fazendo de errado?

    public class AgendamentoViewModel : BaseViewModel
    {
        const string URL_POST_AGENDAMENTO = "https://aluracar.herokuapp.com/salvaragendamento";

        public Agendamento Agendamento { get; set; }

        public string Modelo
        {
            get
            {
                return this.Agendamento.Modelo;
            }
            set
            {
                this.Agendamento.Modelo = value;
            }
        }

        public decimal Preco
        {
            get
            {
                return this.Agendamento.Preco;
            }
            set
            {
                this.Agendamento.Preco = value;
            }
        }

        public string Nome
        {
            get
            {
                return this.Agendamento.Nome;
            }
            set
            {
                this.Agendamento.Nome = value;
                OnPropertyChanged();
                ((Command)AgendarCommand).ChangeCanExecute();
            }
        }

        public string Fone
        {
            get
            {
                return this.Agendamento.Fone;
            }
            set
            {
                this.Agendamento.Fone = value;
                OnPropertyChanged();
                ((Command)AgendarCommand).ChangeCanExecute();
            }
        }

        public string Email
        {
            get
            {
                return this.Agendamento.Email;
            }
            set
            {
                this.Agendamento.Email = value;
                OnPropertyChanged();
                ((Command)AgendarCommand).ChangeCanExecute();
            }
        }

        public DateTime DataAgendamento
        {
            get
            {
                return Agendamento.DataAgendamento;
            }
            set
            {
                Agendamento.DataAgendamento = value;
            }
        }

        public TimeSpan HoraAgendamento
        {
            get
            {
                return Agendamento.HoraAgendamento;
            }
            set
            {
                Agendamento.HoraAgendamento = value;
            }
        }

        public AgendamentoViewModel(Veiculo veiculo, Usuario usuario)
        {
            this.Agendamento = new Agendamento(usuario.Nome,usuario.Telefone,usuario.Email,veiculo.Nome,veiculo.Preco);


            AgendarCommand = new Command(() =>
            {
                MessagingCenter.Send<Agendamento>(Agendamento, "Agendar");
            }, ()=>
            {
                return !string.IsNullOrEmpty(this.Nome) &&
                !string.IsNullOrEmpty(this.Fone) &&
                !string.IsNullOrEmpty(this.Email);
            });

        }

        public ICommand AgendarCommand { get; set; }

        public async void SalvarAgendamento()
        {
            HttpClient cliente = new HttpClient();

            var DataHoraAgendamento = new DateTime(DataAgendamento.Year, DataAgendamento.Month, DataAgendamento.Day,
                HoraAgendamento.Hours, HoraAgendamento.Minutes, HoraAgendamento.Seconds);

            var json = JsonConvert.SerializeObject(new
            {
                nome = Nome,
                fone = Fone,
                email = Email,
                carro = Modelo,
                preco = Preco,
                dataAgendamento = DataHoraAgendamento
            });

            StringContent conteudo = new StringContent(json, Encoding.UTF8, "application/json");

            var resposta = await cliente.PostAsync(URL_POST_AGENDAMENTO, conteudo);
            this.Agendamento.Confirmado = resposta.IsSuccessStatusCode;
            SalvarAgendamentoDB();

            if (this.Agendamento.Confirmado)
            {
                MessagingCenter.Send<Agendamento>(this.Agendamento, "SucessoAgendamento");
            }
            else
            {
                MessagingCenter.Send<ArgumentException>(new ArgumentException(), "FalhaAgendamento");
            }

        }

        private void SalvarAgendamentoDB()
        {
            using (var conexao = DependencyService.Get<ISQlite>().PegarConexao())
            {
                AgendamentoDAO dao = new AgendamentoDAO(conexao);
                dao.Salvar(new Agendamento(Nome, Fone, Email, Modelo, Preco, DataAgendamento, HoraAgendamento));
            }
        }
    }
3 respostas

Olá, Guilherme

É possível que esteja ocorrendo uma exceção não tratada ao executar o código.

Sugiro você envolver o código acima dentro de um block try-catch e colocar um breakpoint para monitorar a exceção:

try
{
    this.Agendamento.Confirmado = resposta.IsSuccessStatusCode;
    SalvarAgendamentoDB();

    if (this.Agendamento.Confirmado)
    {
        MessagingCenter.Send<Agendamento>(this.Agendamento, "SucessoAgendamento");
    }
    else
    {
        MessagingCenter.Send<ArgumentException>(new ArgumentException(), "FalhaAgendamento");
    }
}
catch (Exception exc)
{
    //Colocar um breakpoint na linha abaixo
    var erro = exc.ToString();
}

Olá Marcelo. Então, eu coloquei o breakpoint, e está aparentemente normal. O problema é que o atributo conteúdo, da classe Agendamento está sempre dando false, ou seja, é como se não estivesse guardando o atributo na hora de receber a resposta. Vou até copiar os outros códigos.

ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:converters="clr-namespace:TestDrive.Converters"
             x:Class="TestDrive.Views.AgendamentosUsuarioView"
             Title="Meus Agendamentos">
    <ContentPage.Resources>
        <ResourceDictionary>
            <converters:AgendamentoConfirmadoConverter x:Key ="confirmadoConverter">
            </converters:AgendamentoConfirmadoConverter>
        </ResourceDictionary>
    </ContentPage.Resources>
    <ListView x:Name="listViewAgendamentos" ItemsSource="{Binding Agendamentos}" Margin="25">
        <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <ViewCell.View>
                        <StackLayout Orientation="Horizontal">
                            <Label Text="{Binding DataFormatada}" 
                                   FontSize="20" 
                                   VerticalOptions="Center"></Label>
                            <Label Text=" - " VerticalOptions="Center"></Label>
                            <Label Text="{Binding Modelo}" 
                                   FontAttributes="Bold"
                                   VerticalOptions="Center"></Label>
                            <Label Text="{Binding Confirmado}"></Label>
                        </StackLayout>
                    </ViewCell.View>
                </ViewCell>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ContentPage>
using SQLite;
using System;
using System.Collections.Generic;
using System.Text;

namespace TestDrive.Models
{
    public class Agendamento
    {   
        [PrimaryKey, AutoIncrement]
        public int ID { get; set; }
        public string Nome { get; set; }
        public string Fone { get; set; }
        public string Email { get; set; }
        public string Modelo { get; set; }
        public decimal Preco { get; set; }
        public bool Confirmado { get; set; }


        DateTime dataAgendamento = DateTime.Today;
        public DateTime DataAgendamento
        {
            get
            {
                return dataAgendamento;
            }
            set
            {
                dataAgendamento = value;
            }
        }

        public string DataFormatada
        {
            get
            {
                return DataAgendamento.Add(HoraAgendamento).ToString("dd/MM/yyyy HH:mm");
            }
        }

        public TimeSpan HoraAgendamento { get; set; }


        public Agendamento()
        {

        }

        public Agendamento(string nome, string fone, string email, string modelo, decimal preco)
        {
            this.Nome = nome;
            this.Fone = fone;
            this.Email = email;
            this.Modelo = modelo;
            this.Preco = preco;
        }

        public Agendamento(string nome, string fone, string email, string modelo, decimal preco, DateTime dataAgendamento, TimeSpan horaAgendamento)
            : this(nome, fone, email, modelo, preco)
        {
            this.DataAgendamento = dataAgendamento;
            this.HoraAgendamento = horaAgendamento;
        }

    }
}
solução!

Descobri o que aconteceu. Criei um quarto construtor na classe de Agendamentos com o atributo bool Confirmado:

public Agendamento(string nome, string fone, string email, string modelo, decimal preco, DateTime dataAgendamento, TimeSpan horaAgendamento, bool confirmado)
            : this(nome, fone, email, modelo, preco, dataAgendamento, horaAgendamento)
        {
            this.Confirmado = confirmado;
        }

Em seguida, alterei o método SavarAgendamentoDB na classe AgendamentoViewModel para acrescentar o atributo em questão na hora de gravar no DB local:

private void SalvarAgendamentoDB()
        {
            using (var conexao = DependencyService.Get<ISQlite>().PegarConexao())
            {
                AgendamentoDAO dao = new AgendamentoDAO(conexao);
                dao.Salvar(new Agendamento(Nome, Fone, Email, Modelo, Preco, DataAgendamento, HoraAgendamento, this.Agendamento.Confirmado));
            }
        }