Flickr Images

Pages

Banner 468

terça-feira, 2 de agosto de 2011

Monitorar Mudanças de Propriedades

0 comentários
 
Olá para todos!!!!!
Essa semana, que começou ontem, tive a necessidade de monitorar quando uma determinada propriedade de minha classe teve seu valor alterado. Dei uma pesquisada por ai até que cheguei na interface INotifyPropertyChagend. Ela basicamente cria um evento que será disparado quando a propriedade for alterada.
Para demonstrar o uso dessa interface criei um exemplo bem bobo. Nesse caso tenho uma classe com o nome de Aluno com as propriedades: Nome, AnoNascimento, Horario que é um enum do tipo Turno. Vamos ao código?

Primeiro vou criar um projeto do tipo console application. Em seguida adicionar uma classe com o nome de Aluno.

Não esqueça de adicionar using System.ComponentModel.

Agora informamos que a classe Aluno implementa a interface INotifyPropertyChaged. Observe que a interface gerou o seguinte evento:




Agora criamos o metodo Notify, que será responsável por invocar o evento criado.


Vamos agora na propriedade que queremos monitorar, no caso a propriedade turno. Nela chamamos o método Notify quando a propriedade receber um novo valor. Observe:


Apenas para o exemplo falei que o set é um tipo privado, logo poderemos alterar o valor da propriedade Horario somente pela própria classe aluno.

Por fim criamos um método que apenas irá alterar o valor da propriedade Horario.


Feito isso vamos a classe Program do nosso projeto. Dentro do método main vou criar um objeto da classe Aluno e preencher algumas propriedades. Em seguida adicionar o evento ProperyChanged.


No método gerado vamos exibir os novos valores da propriedade Horario da variável aluno:

Agora todas as classes:



   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.ComponentModel;
   6:   
   7:  namespace TrabalhandoComPropriedades
   8:  {
   9:      public class Aluno : INotifyPropertyChanged
  10:      {
  11:          public enum Turno
  12:          {
  13:              Manha,
  14:              Tarde,
  15:              Noite
  16:          }
  17:   
  18:          #region INotifyPropertyChanged Members
  19:   
  20:          public event PropertyChangedEventHandler PropertyChanged;
  21:   
  22:          #endregion
  23:   
  24:          public string Nome
  25:          {
  26:              get;
  27:              set;
  28:          }
  29:   
  30:          public int AnoNascimento
  31:          {
  32:              get;
  33:              set;
  34:          }
  35:   
  36:          private Turno _horario = Turno.Manha;
  37:          public Turno Horario
  38:          {
  39:              get
  40:              {
  41:                  return _horario;
  42:              }
  43:              private set
  44:              {
  45:                  _horario = value;
  46:                  Notify("Horario");
  47:              }
  48:          }
  49:   
  50:          private void Notify(string property)
  51:          {
  52:              if (PropertyChanged != null)
  53:              {
  54:                  PropertyChanged.Invoke(this, new PropertyChangedEventArgs(property));
  55:              }
  56:          }
  57:   
  58:          internal void ProcessarTurnos()
  59:          {
  60:              this.Horario = Turno.Tarde;
  61:              System.Threading.Thread.Sleep(1000);
  62:              this.Horario = Turno.Noite;
  63:          }
  64:      }
  65:  }





   1:  using System;
   2:  using System.Collections.Generic;
   3:  using System.Linq;
   4:  using System.Text;
   5:  using System.ComponentModel;
   6:   
   7:  namespace TrabalhandoComPropriedades
   8:  {
   9:      class Program
  10:      {
  11:          static void Main(string[] args)
  12:          {
  13:              Aluno aluno = new Aluno();
  14:              aluno.Nome = "Pedro Marques";
  15:              aluno.AnoNascimento = 1984;
  16:              aluno.PropertyChanged += new PropertyChangedEventHandler(aluno_PropertyChanged);
  17:              aluno.ProcessarTurnos();
  18:              Console.ReadKey();
  19:          }
  20:   
  21:          static void aluno_PropertyChanged(object sender, PropertyChangedEventArgs e)
  22:          {
  23:              Console.WriteLine("Propriedade {0} alterada para {1}", e.PropertyName, ((Aluno)sender).Horario.ToString());
  24:          }
  25:      }
  26:  }

E o resultado:

Leave a Reply

O que achou? Alguma coisa esta errada? Quem sabe uma sugestão? Faça seu comentário e/ou crítica logo abaixo!