Compartir a través de


Eventos de cambio de propiedad

Windows Presentation Foundation (WPF) define varios eventos que se generan en respuesta a un cambio en el valor de una propiedad. A menudo, la propiedad es una propiedad de dependencia. El propio evento puede ser un evento enrutado o un evento de Common Language Runtime (CLR) estándar, en función de si el evento se debe enrutar a través de un árbol de elementos, o solo se produce en el objeto donde cambió la propiedad. Este último escenario se aplica cuando un cambio de propiedad solo es relevante para el objeto en el que cambió el valor de propiedad.

Prerrequisitos

En este artículo se parte de que tiene un conocimiento básico de las propiedades de dependencia y que ha leído Vista general sobre eventos enrutados.

Identificación de un evento de cambio de propiedad

No todos los eventos que notifican un cambio de propiedad se identifican explícitamente como un evento de cambio de propiedad a través de su firma o patrón de nombres. La documentación del SDK realiza referencias cruzadas a propiedades con eventos e indica si un evento está vinculado directamente a un cambio de valor de propiedad.

Algunos eventos utilizan un tipo de datos de evento y un delegado que son específicos para los eventos de cambio de propiedad. Por ejemplo, los eventos RoutedPropertyChanged y DependencyPropertyChanged tienen firmas específicas. Estos tipos de eventos se describen en las secciones siguientes.

Eventos RoutedPropertyChanged

Los eventos RoutedPropertyChanged tienen RoutedPropertyChangedEventArgs<T> datos de eventos y un RoutedPropertyChangedEventHandler<T> delegado. Tanto los datos del evento como el delegado tienen un parámetro Tde tipo genérico . Especifique el tipo real de la propiedad modificada al definir el controlador. Los datos del evento contienen las OldValue propiedades y NewValue , cuyo tipo de tiempo de ejecución es el mismo que la propiedad modificada.

La parte "Enrutada" del nombre indica que el evento de cambio de propiedad se registra como un evento enrutado. La ventaja de un evento enrutado cambiado de propiedad es que se notifica a los elementos primarios cada vez que cambian las propiedades del elemento secundario. Esto significa que el elemento de nivel superior de un control recibe eventos modificados de propiedad cuando cambia el valor de cualquiera de sus partes compuestas. Por ejemplo, supongamos que crea un control que incorpora un RangeBase control, como un Slider. Si la Value propiedad cambia en la parte deslizante, puede controlar ese cambio en el control primario en lugar de en la parte.

Evite usar un controlador de eventos de cambio de propiedad para validar el valor de la propiedad, ya que no es la intención de diseño para la mayoría de los eventos de cambio de propiedad. Por lo general, se proporciona el evento de cambio de propiedad para que pueda responder al cambio de valor en otras áreas lógicas del código. No es aconsejable cambiar nuevamente el valor de la propiedad desde el controlador de eventos de cambio de propiedad, ya que esto puede provocar recursividad involuntaria dependiendo de la implementación del controlador.

Si su propiedad es una propiedad de dependencia personalizada o si está trabajando con una clase derivada en la que usted ha definido el código para crear instancias, el sistema de propiedades de WPF tiene una mejor manera de realizar un seguimiento de los cambios de propiedad. Para ello, se debe utilizar las devoluciones de llamada integradas CoerceValueCallback y PropertyChangedCallback del sistema de propiedades. Para obtener más información sobre cómo puede usar el sistema de propiedades de WPF para la validación y la coerción, vea Devoluciones de llamada de propiedades de dependencia y Validación y Propiedades de dependencia personalizadas.

Eventos de "DependencyPropertyChanged"

Los eventos DependencyPropertyChanged tienen DependencyPropertyChangedEventArgs datos de eventos y un DependencyPropertyChangedEventHandler delegado. Estos eventos son eventos CLR estándar, no eventos enrutados. DependencyPropertyChangedEventArgs es un tipo de informe de datos de eventos inusual porque no se deriva de EventArgs y es una estructura, no una clase.

Un ejemplo de un DependencyPropertyChanged evento es IsMouseCapturedChanged. DependencyPropertyChanged son eventos ligeramente más comunes que RoutedPropertyChanged.

Similar a los datos del evento RoutedPropertyChanged, los datos del evento DependencyPropertyChanged contienen las propiedades OldValue y NewValue. Por los motivos mencionados anteriormente, evite usar un controlador de eventos de cambio de propiedad para cambiar el valor de la propiedad nuevamente.

Desencadenadores de propiedad

Un concepto estrechamente relacionado con un evento de cambio de propiedad es un activador de propiedad. Se crea un desencadenador de propiedad dentro de un estilo o plantilla. El desencadenador de propiedad permite crear un comportamiento condicional basado en el valor de la propiedad a la que se asigna el desencadenador.

La propiedad sobre la que actúa un activador de propiedad debe ser una propiedad de dependencia. Puede ser, y a menudo lo es, una propiedad de dependencia de solo lectura. Si una propiedad de dependencia expuesta por un control tiene un nombre que comienza por "Is", es un buen indicador de que la propiedad estaba al menos diseñada parcialmente para ser un activador de propiedad. Las propiedades con esta nomenclatura suelen ser propiedades de dependencia de solo Boolean lectura, donde el escenario principal de la propiedad es notificar el estado de control. Si el estado del control afecta a la interfaz de usuario en tiempo real, la propiedad de dependencia es un candidato para ser un disparador de propiedad.

Algunas propiedades de dependencia tienen un evento de cambio de propiedad dedicado. Por ejemplo, IsMouseCaptured tiene el IsMouseCapturedChanged evento de cambio de propiedad. La IsMouseCaptured propiedad es de solo lectura y el sistema de entrada modifica su valor. El sistema de entrada genera el evento IsMouseCapturedChanged en cada cambio en tiempo real.

Limitaciones de los activadores de propiedades

En comparación con un evento de cambio de propiedad real, los desencadenadores de propiedad tienen algunas limitaciones.

Los desencadenadores de propiedad funcionan a través de una lógica de coincidencia exacta, donde se especifica un nombre de propiedad y un valor específico que activará el desencadenador. Un ejemplo es <Setter Property="IsMouseCaptured" Value="true"> ... </Setter>. La sintaxis del desencadenador de propiedades limita la mayoría de los usos a aquellas propiedades que aceptan un valor de enumeración dedicado. El intervalo de valores posibles debe ser manejable, de modo que pueda definir un desencadenador para cada caso. A veces, los desencadenadores de propiedades solo existen para valores especiales, como cuando un recuento de elementos alcanza cero. No se puede establecer un desencadenador único para activarse cuando un valor de propiedad cambia desde un valor específico, como cero. En lugar de usar varios desencadenadores para todos los casos distintos de cero, considere la posibilidad de implementar un controlador de eventos de código o un comportamiento predeterminado que se desactive del estado del desencadenador siempre que el valor sea distinto de cero.

La sintaxis del desencadenador de propiedades es análoga a una instrucción "if" en la programación. Si la condición del activador es verdadera, entonces el "cuerpo" del activador de la propiedad se "ejecuta". El "cuerpo" de un disparador de propiedad no es código, es marcado. Ese marcado se limita a usar uno o varios Setter elementos para establecer otras propiedades del objeto donde se aplica el estilo o la plantilla.

Cuando la condición "if" de un desencadenador de propiedad tiene una amplia variedad de valores posibles, es aconsejable establecer ese mismo valor de propiedad en un valor predeterminado utilizando Setter fuera del desencadenador. De este modo, el configurador dentro del desencadenador tendrá prioridad cuando la condición del desencadenador sea true; de lo contrario, el Setter fuera del desencadenador tendrá prioridad.

Los desencadenadores de propiedades son útiles para escenarios en los que una o varias propiedades de apariencia deben cambiar en función del estado de otra propiedad en el mismo elemento.

Para obtener más información sobre los desencadenadores de propiedades, consulte Aplicación de estilos y plantillas.

Consulte también