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

Composição da Classe ViewModel

Boa noite,

Utilizando o Padrão MVVM, percebi que o código realmente pode ser melhor utilizado, assim como realizadas com facilidade as manutenções quando necessárias.

Ao mesmo, na ViewModel existem as propriedades que serão utilizadas pelo BindingContext, assim como Eventos/Comandos e outras particularidades. Essas propriedades já existem em uma classe Model. No exemplo abaixo, consideremos a Classe Model "Agendamento":

 public class Agendamento {
        public Veiculo Veiculo { get; set; }
        public string Nome { get; set; }
        public string Fone { get; set; }
        public string Email { get; set; }

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

Agora, um trecho da Classe AgendamentoViewModel:

 public class AgendamentoViewModel : BaseViewModel {
        const string URL_POST_AGENDAMENTO = "https://aluracar.herokuapp.com/salvaragendamento";
        public Agendamento Agendamento { get; set; }
        public Veiculo Veiculo  {
            get {
                return Agendamento.Veiculo;
            }
            set {
                Agendamento.Veiculo = value;
            }
        }
        public string Nome {
            get {
                return Agendamento.Nome;
            }
            set {
                Agendamento.Nome = value;
                OnPropertyChanged();
                ((Command)AgendarCommand).ChangeCanExecute();
            }
        }
        public string Fone {
            get {
                return Agendamento.Fone;
            }
            set {
                Agendamento.Fone = value;
                OnPropertyChanged();
                ((Command)AgendarCommand).ChangeCanExecute();
            }
        }
        public string Email {
            get {
                return Agendamento.Email;
            }
            set {
                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;
            }
        }

Reparei que na ViewModel apenas foram ajustadas os Get/Set, contudo as propriedades são as mesmas da Classe Model. Gostaria de entender o porquê foram novamente inseridos nesse escopo.

Obrigado, Abs.

3 respostas

Outro caso, está no Login (Model) x LoginViewModel.

Tenho a Classe Model:

 public class Usuario {
        public string Nome { get; set; }
        public string Senha { get; set; }
    }

E tenho a Classe ViewModel (um breve trecho):

public class LoginViewModel {
        private string usuario;
        public string Usuario{
            get {
                return usuario;
            }
            set {
                usuario = value;
            }
        }

        private string senha;
        public string Senha  {
            get {
                return senha;
            }
            set {
                senha = value;
            }
        }

Eu não poderia Herdar ou declarar em ViewModel (de repente) a Classe Usuário e, no arquivo xaml no Binding informar Usuario.Propriedade!?

Abs.

solução!

Bom dia. Não é a maneira correta de se trabalhar com o MVVM. Já que essa estrutura trabalha da seguinte maneira: View ligada com a ViewModel e a ViewModel o Model. A fazer a herança de uma model na view, estaria não só infringindo o padrão MVVM, quanto o conceito de herança. Já que uma viewmodel representa um model e não é um subtipo de model. Mas nada te impede de fazer isso. Se utilizar "Usuario.Propriedade!", você estaria fazendo o biding dos elementos do seu model e não da viewModel, e também não iria conseguir usar a interface INotityProprertyChanged.

Perfeito, esclareceu muito bem.

Obrigado!

Abs.

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software