2008-10-04 10 views
11

INotifyPropertyChanged es bastante auto explicativo y creo que tengo claro cuándo plantearlo (es decir, cuando termine de actualizar los valores).
Si implemento INotifyPropertyChanging estoy tendiendo a plantear el evento tan pronto como ingrese al setter u otro método que cambie el estado de los objetos y luego continúe con las protecciones y validaciones que puedan ocurrir.INotifyPropertyCambio y validaciones: ¿cuándo realizo PropertyChanging?

Así que estoy tratando el evento como una notificación de que la propiedad puede cambiar pero aún no se ha modificado, y puede que no termine de cambiar correctamente.

Si los consumidores del objeto están utilizando esta propiedad (como vamos a decir LINQ to SQL utilizando el evento para el seguimiento de cambios) ¿debería esperar y solo plantear el evento una vez que haya validado los valores que he recibido son buenos y el estado del objeto es válido para el cambio?

¿Cuál es el contrato para este evento y qué efectos secundarios habría en los suscriptores?

Respuesta

13

Si su objeto tiene un valor que no es válido para la propiedad y lanza una excepción, entonces no debe plantear el evento PropertyChanging. Solo debe plantear el evento cuando haya decidido que el valor cambiará a. El escenario de uso típico es para cambiar un campo simple:

public T Foo 
{ get 
    { return m_Foo; 
    } 
    set 
    { if (m_Foo == value) return; //no need for change (or notification) 
     OnPropertyChanging("Foo"); 
     m_Foo = value; 
     OnPropertyChanged("Foo"); 
    } 
} 
+0

viendo como trabajabas en DLINQ (se habría llamado así, ¿verdad?) Creo que esto es bastante autoritario. ¿Hay alguna referencia a la que pueda dirigirme? –

+0

DLINQ fue desarrollado por la división de desarrolladores (que incluye el equipo de Visual Studio). El equipo de ADO.NET creó LINQ para DataSet y LINQ para Entidades. Hay una referencia en http://msdn.microsoft.com/en-us/library/bb425822.aspx#linqtosql_topic25 –

+0

Estoy corregido. Gracias. –

1

Como acotación al margen - PostSharp tiene la capacidad de auto-interesante para poner en práctica INotifyPropertyChanged - like so.

+0

eso es interesante. He estado usando un fragmento de código (y hay una clase base que en realidad contiene el evento y lo plantea), pero parece que está pidiendo a gritos que sea el problema de alguien más. –

+0

Como otro lado, esto también puede ser 'implementado automáticamente' con alguna magia DI/IOC bastante interesante - [visto aquí] (http://stackoverflow.com/questions/871405/why-do-i-need-an- ioc-container-as-oppos-to-straightforward-di-code/1532254 # 1532254) (No me venden en esto, pero hace una lectura pedagógica interesante si no hay nada más) – fostandy

0

Si desea evitar la implementación de INotifyPropertyChanged por completo, considere usar Update Controls .NET en su lugar. Esto elimina casi todo el código de contabilidad.

Cuestiones relacionadas