2012-05-08 11 views
7

Ho una casella di riepilogo con elementi associati a una ObservableCollection.Come aggiornare l'interfaccia utente da ViewModel con ObservableCollection?

Ora, dall'interno di viewModel, ho bisogno di causare un aggiornamento all'interfaccia utente. Non ho riferimenti alla casella di riepilogo dal mio modello di vista.

Se rimuovo o aggiungo un articolo dalla mia ObservableCollection, l'interfaccia utente viene aggiornata.

Sulla base di qualche altra logica ho bisogno di aggiornare l'interfaccia utente ... ma ObservableCollection è lo stesso.

Come aggiornare l'interfaccia utente SENZA aggiungere o rimuovere elementi dalla mia ObservableCollection?

Grazie

+0

che cosa c'è da aggiornare se nulla nella collezione è cambiato? –

+0

Onestamente ... abbiamo un'applicazione enorme che utilizza WPF e MVVM e non abbiamo MAI avuto bisogno di questo. Dicci cosa esattamente vuoi aggiornare, perché sono abbastanza sicuro che ci siano modi per farlo. – dowhilefor

+0

Se devi aggiornare l'interfaccia utente senza modificare la tua raccolta, forse dovresti connettere qualcos'altro nella tua VM alla tua vista ... non tutto deve essere catalogato tramite 'ObservableCollection's ... – BoltClock

risposta

9

Se avete bisogno di cambiare l'interfaccia utente perché hai modificato le voci nel vostra collezione, allora si dovrebbe organizzare per tali elementi per implementare l'interfaccia INotifyPropertyChanged. Se gli oggetti all'interno della tua raccolta hanno un evento PropertyChanged, l'interfaccia utente ascolterà quell'evento da singoli elementi. (Se possibile, si potrebbe anche modificare le voci nella vostra collezione per essere DependencyObjects con DependencyProperties, che compie lo stesso obiettivo.)

Se davvero necessità di attivare un aggiornamento dell'interfaccia utente quando niente affatto sulla tua collezione è cambiato, il modo per farlo è quello di aumentare manualmente l'evento CollectionChanged. Questo non può essere fatto con lo ObservableCollection<> così com'è, ma è possibile ricavare una nuova raccolta da quella classe e chiamare il metodo protected OnCollectionChanged da un nuovo metodo, public.

+0

Grazie per la risposta ..ciò ha senso. – user1202434

3

Ho avuto un problema simile in cui volevo cambiare lo sfondo di un oggetto, ma ovviamente né l'oggetto né la collezione sono cambiati.

E 'stato raggiunto chiamando:

CollectionViewSource.GetDefaultView(your_collection_name).Refresh(); 

Questa rinfrescato la vista dal modello di vista senza alterare le collezioni

Problemi correlati