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.
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: