Domanda

Credo che sia piuttosto un problema comune in scenari di associazione dati. Cosa fai di solito, se si esegue un aggiornamento batch e vuole evitare che un-dependend PropertyChanged calcoli / azioni / qualunque cosa sono eseguiti per ogni singolo aggiornamento?

La prima cosa che viene in genere a mio parere, è quello di uno introduce un nuovo booleano o sganciare / agganciare l'EventHandler, ...

Quello che non mi piace di questo approcci è:

  • introducono nuove complessità (deve essere mantenuta, ...)
  • che sono soggetto a errori, perché si deve fare in modo che un notifiche soppressi vengono inviate successivamente

Mi chiedo se qualcuno ha affrontato questo problema già in un modo più conveniente che è più facile da gestire?

tia Martin

Edit: non missunderstand me. So che le cose .NET fornisce come RaiseListChangedEvents da BindingList, ... Sono tutti affrontando il problema in modo più / meno allo stesso modo come ho descritto, ma sto cercando un modo diverso, che non ha bisogno di inconvenienti elencati . Forse sono sulla strada sbagliata, ma se mi danno una prova qui ...

È stato utile?

Soluzione

Non c'è un unico one-size-fits-all soluzione, purtroppo. Ho applicato o visto le seguenti soluzioni:

  1. Ci sono due singals. Un segnale viene emesso quando il cambiamento viene da un'azione dell'utente, l'altro spara sempre. Questo permette di distinguere tra i cambiamenti nell'interfaccia utente e aggiornamenti di codice.

  2. Un valore booleano per proteggere codice

  3. Il quadro evento proprietà ferma moltiplicazione automaticamente gli eventi quando un valore non è cambiato molto.

  4. Un metodo di congelamento / scongelamento del segnale o il direttore del segnale (vale a dire l'intero quadro)

  5. Un modo per unire i segnali in una sola. Si può fare aggiornamenti N e ottengono raccolti in segnali M, dove M <= N. Se si modifica la stessa proprietà 100 volte, è ancora ottenere solo 1 segnale.

  6. Queuing di segnali (invece di esecuzione sincrona). Il codice di messa in coda può quindi unire i segnali, anche. Ho usato questo con grande successo in un'applicazione che non ha un pulsante "Salva". Tutte le modifiche vengono salvate nel database come li fate. Quando si modifica un testo, le modifiche vengono unite nel corso di un certo periodo di tempo (vale a dire fino a quando le precedenti dichiarazioni aggiornamento DB) e poi, sono impegnati in una singola modifica.

  7. Un'API per impostare diversi valori immediatamente; solo un singolo segnale viene emesso.

  8. Il quadro segnale può inviare segnali a diversi livelli di granularità. Diciamo che avete una persona con un nome. Quando si cambia il nome, si ottengono due segnali: uno per il cambio di nome e un "campo di istanza cambiato". Quindi, se avete a cuore solo "ha qualcosa è cambiato", allora si può collegare in l'istanza invece di tutti i campi.

Altri suggerimenti

Quale piattaforma? Il post mi fa pensare NET.

Quello che è gli oggetti sottostanti? Ad esempio, BindingList<T> come fonte consente di disabilitare le notifiche impostando RaiseListChangedEvents su false mentre si fa l'aggiornamento.

Oltre a questo (o simili); Sì, scollegare il legame durante grandi aggiornamenti

La via più facile da prendere è quello di utilizzare il componente BindingSource per l'associazione dei dati. Invece di legare i controlli ad un particolare oggetto (o IList), utilizzare l'oggetto come il DataSource per il BindingSource, quindi associare i controlli per il BindingSource.

La classe BindingSource ha funzioni SuspendBinding() e ResumeBinding().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top