atribuicao do valor ao membro interno da classe, somente se da caso o valor que chega para ela seja diferente do qual ela possui, justamente porque nao faz sentido notificar alguem que a propriedade foi mudada, mas que efetivamente nao foi. E importante notar tambem que a alteracao que sera feita na propriedade esta envolvida pela chamada dos eventos, ou seja, antes da alteracao disparamos o evento PropertyChanging, e depois que a alteracao foi realizada, disparamos o evento PropertyChanged.public class Cliente : INotifyPropertyChanging, INotifyPropertyChanged{private string _nome;public string Nome{get{return this._nome;}set{if (value != this._nome){this.OnPropertyChanging("Nome");this._nome = value;this.OnPropertyChanged("Nome");}}}public event PropertyChangingEventHandler PropertyChanging;public event PropertyChangedEventHandler PropertyChanged;protected virtual void OnPropertyChanging(string propertyName){if (this.PropertyChanging != null)this.PropertyChanging(this, new PropertyChangingEventArgs(propertyName));}protected virtual void OnPropertyChanged(string propertyName){if (this.PropertyChanged != null)this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));}}Com isso, ao construir um objeto do tipo Cliente, definimos a sua propriedade Nome como "Israel". Em seguida, nos vinculamos aos eventos PropertyChanging e PropertyChanged, para sermos notificados caso qualquer alteracao aconteca nas propriedades deste objeto. Tudo o que estamos fazendo no codigo abaixo, e escrevendo na tela a notificacao da alteracao da propriedade Nome. Finalmente, quando alteramos a propriedade Nome de "Israel" para "Israel Aece", notamos que as mensagens de notificacao aparecerao na tela.Cliente c = new Cliente() { Nome = "Israel" };c.PropertyChanging += (sender, e) => Console.WriteLine("Alterando a propriedade '{0}'.", e.PropertyName);c.PropertyChanged += (sender, e) => Console.WriteLine("Propriedade '{0}' alterada.", e.PropertyName);c.Nome = "Israel Aece";Assim como existe essas interfaces que agregam as nossas classes, a possibilidade de serem monitoradas quando alguma mudanca acontecer, tambem ha uma nova interface chamada INotifyCollectionChanged (namespace System.Collections.Specialized), que como o nome sugere, permite adicionar a uma colecao, a possibilidade de monitoramento da mesma, onde seremos notificados quando ela for modificada, ou seja, quando elementos forem adicionados ou removidos. Essa interface fornece um unico membro, que e o evento CollectionChanged.Esse evento faz uso de um parametro do tipo NotifyCollectionChangedEventArgs, que expoe algumas propriedades interessantes, como por exemplo: Action, NewItems e OldItems. O primeiro deles, retorna uma das opcoes do enumerador NotifyCollectionChangedAction, dizendo qual foi a acao que aconteceu. Ja a propriedade NewsItems, disponiliza um objeto do tipo IList, contendo os novos itens que foram adicionados, enquanto a propriedade OldItens, retorna o mesmo tipo da propriedade anterior, mas com os objetos que foram removidos da colecao.Essa interface nos permite criar uma colecao que pode ser monitorada quando os elementos dela sao manipulados. Felizmente, a Microsoft ja adicionou uma colecao generica chamada ObservableCollection<T>, que esta debaixo do namespace System.Collections.ObjectModel, ja implementada com essa funcionalidade.E importante dizer que quando estamos falando no monitoramento de modificacoes em uma colecao, estamos atentos aos itens que ela armazena, se novos sao inseridos, se outros sao removidos, alterados, etc. Se uma propriedade de um objeto que esta dentro dela for alterada, nada acontecera a colecao. Como exemplo de uso, podemos visualizar o codigo abaixo, que cria uma instancia desta colecao, definindo o tipo T como sendo Cliente. Antes de comecarmos a manipular a colecao, vamos nos vincular ao evento CollectionChanged, para sermos notificados quando novos itens forem adicionados ou removidos.static void Main(string[] args){ObservableCollection<Cliente> clientes = new ObservableCollection<Cliente>();clientes.CollectionChanged += ColecaoAlterada;clientes.Add(new Cliente() { Nome = "Israel" });clientes.Add(new Cliente() { Nome =