L'immagine sotto mostra come funziona il mio codice. Quando premo il pulsante 2, la listbox viene aggiornata, ma non quando premo il pulsante 1. Perché?La lista delle Winform non si aggiorna quando i dati associati cambiano
pseudo code http://i44.tinypic.com/mj69oj.gif
è il problema filettatura correlato? Se lo è, dove dovrei aggiungere la chiamata a (Begin) Invoke?
Una cosa interessante da notare è che se premo prima il pulsante 1 e poi il pulsante 2, i dati generati dal clic del pulsante1 vengono visualizzati quando faccio clic sul pulsante2. Quindi sembra che i dati generati da doFoo vengano memorizzati in un buffer da qualche parte, e poi spinti alla lista quando premo il pulsante 2.
EDIT:
Ho provato ad aggiungere AddNumber al codice del modulo, e ha aggiunto una chiamata a Invoke quando listBox1.InvokeRequired restituisce true. Questo risolve il problema, ma non è il più bello dei progetti. Non voglio che la GUI debba "preoccuparsi" di come aggiungere elementi a un elenco che fa parte del modello.
Come posso mantenere la logica dietro l'aggiunta alla lista interna alla classe list, mentre sto ancora aggiornando la GUI quando la lista cambia?
EDIT 2:
Ora che abbiamo confermato che si tratta di un problema di threading Ho aggiornato l'immagine in modo da riflettere più da vicino il design del codice vero e proprio su cui sto lavorando.
Mentre il suggerimento di Lucero risolve ancora il problema, speravo in qualcosa che non richiedesse che il modulo fosse a conoscenza della dll o CDllWrapper.
Il modello (ListBoxDataBindingSource ecc) deve sapere nulla circa la vista (listboxes, bottoni, etichette ecc)
Capisco qual è il problema, ora dobbiamo solo trovare una buona soluzione :) Sto provando a progettarlo in base al pattern MVC, quindi lasciare ListBoxDa taBindingSource (parte del Modello) sapere di un controllo (parte della Vista) è generalmente visto come una cattiva pratica. – Tobbe
Beh, non è davvero sapere del controllo, ma ha solo bisogno di sapere hot per effettuare il marshalling della chiamata add al thread corretto. Puoi creare la tua classe di marshalling che conosce il controllo e viene passata all'elenco, in modo che questo aspetto sia nascosto correttamente. – Lucero
(* @ Tobbe: * Forse [questa risposta] (http://stackoverflow.com/questions/3381536/winforms-data-binding-to-business-objects-in-a-multi-threaded-scenario-without-in/3381685 # 3381685) a una delle mie precedenti domande - [Si applicheranno le Winform data-binding agli oggetti business in uno scenario multi-thread senza InvokeRequired?] (Http://stackoverflow.com/q/3381536/240733) - qui.) – stakx