Pregunta

Creo que es un problema bastante común en los escenarios de enlace de datos. ¿Qué es lo que suele hacer, si está ejecutando una actualización por lotes y quiere evitar que un niño de dependend PropertyChanged cálculos / acciones / lo que sea, se ejecutan para cada uno de los cambios?

La primera cosa que por lo general viene a la mente, es bien introduce un nuevo booleano o desenganche / enganche el manejador de sucesos, ...

Lo que no me gusta de este enfoques es:

  • introducen nueva complejidad (tiene que ser mantenido, ...)
  • que son propensas a errores, ya que hay que asegurarse de que unas notificaciones suprimidos se envían después

Me pregunto si alguien refirió a este problema de una manera más conveniente de que es más fácil de manejar?

tia Martin

Edit: no me missunderstand. Yo sé de las cosas .NET proporciona como RaiseListChangedEvents de BindingList, ... Todos ellos están abordando el problema en más menos de la misma forma / como he descrito, pero estoy en busca de una manera diferente que no tiene por qué inconvenientes enumerados . Tal vez estoy en el camino equivocado, pero si entregase una oportunidad aquí ...

¿Fue útil?

Solución

No hay una sola talla única para toda la solución, por desgracia. He aplicado o visto las siguientes soluciones:

  1. Hay dos singals. Una señal se emite cuando el cambio viene de una acción del usuario, el otro siempre se dispara. Esto permite distinguir entre los cambios en la interfaz de usuario y actualizaciones de código.

  2. Un booleano para proteger el código

  3. El marco de evento de la propiedad se detiene la propagación de eventos automáticamente cuando un valor realmente no cambió.

  4. Un método de congelación / descongelación en la señal o el administrador de la señal (es decir, todo el marco)

  5. A manera de combinar señales en una sola. Usted puede hacer cambios y N consiguen recogidos en señales M, donde M <= N. Si cambia la misma propiedad 100 veces, todavía se consigue solamente 1 de señales.

  6. Queuing de señales (en lugar de ejecución síncrona). El código de colas se puede combinar señales, también. He utilizado este con gran éxito en una aplicación que no tiene un botón "Guardar". Todos los cambios se guardan en la base de datos a medida que los hacen. Cuando se cambia un texto, los cambios se fusionan durante un cierto tiempo (es decir, hasta las anteriores declaraciones de actualización de base de datos) y, a continuación, que están comprometidos como un solo cambio.

  7. Una API para fijar varios valores a la vez; solamente se emite una sola señal.

  8. El marco señal puede enviar señales a diferentes niveles de granularidad. Digamos que tiene una persona con un nombre. Cuando se cambia el nombre, se obtienen dos señales: una para el cambio de nombre y un "campo de instancia cambiado". Así que si sólo se preocupan "tiene algo cambió", entonces se puede enganchar en la instancia en lugar de todos los campos.

Otros consejos

¿En qué plataforma? El puesto me hace pensar .NET.

¿Qué es los objetos subyacentes? Por ejemplo, BindingList<T> como fuente le permite desactivar las notificaciones mediante el establecimiento de RaiseListChangedEvents en false mientras se hace la actualización.

Aparte de eso (o similar); así, desconecte la unión durante grandes cambios

La ruta más fácil de tomar es utilizar el componente BindingSource para la unión de sus datos. En lugar de unión a sus controles a un objeto particular (o IList), utilice ese objeto como el DataSource para la BindingSource, a continuación, se unen los controles para la BindingSource.

La clase BindingSource tiene funciones SuspendBinding() y ResumeBinding().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top