Sto creando un'applicazione WPF che è navigabile tramite i pulsanti e i comandi "Avanti" e "Indietro" personalizzati (ad esempio non utilizzando uno NavigationWindow
). Su uno schermo, ho un ListBox
che deve supportare più selezioni (usando la modalità Extended
). Dispongo di un modello di visualizzazione per questa schermata e memorizzo gli elementi selezionati come proprietà, poiché devono essere mantenuti.Come supportare ListBox SelectedItems vincolante con MVVM in un'applicazione navigabile
Tuttavia, sono a conoscenza del fatto che la proprietà SelectedItems
di un ListBox
è di sola lettura. Ho cercato di risolvere il problema utilizzando this solution here, ma non sono stato in grado di adottarlo nella mia implementazione. Ho scoperto che non posso distinguere tra quando uno o più elementi sono deselezionati e quando navigo tra le schermate (NotifyCollectionChangedAction.Remove
viene generato in entrambi i casi, poiché tecnicamente tutti gli elementi selezionati vengono deselezionati quando si naviga lontano dallo schermo). I miei comandi di navigazione si trovano in un modello di vista separato che gestisce i modelli di visualizzazione per ogni schermata, quindi non posso inserire alcuna implementazione relativa al modello di vista con lo ListBox
.
Ho trovato molte altre soluzioni meno eleganti, ma nessuna di queste sembra imporre un legame bidirezionale tra il modello di vista e la vista.
Qualsiasi aiuto sarebbe molto apprezzato. Posso fornire un po 'del mio codice sorgente se possa aiutare a capire il mio problema.
ah, capisco, già provi a usare un comportamento. utilizzare un BindableCollection per gli elementi selezionati, dovrebbe funzionare. Se hai più problemi, fammelo sapere. Descrivili e daremo un'occhiata. –
si prega di mostrare qualche codice, in particolare il SelectedItems e il XAML. SelectedItems è una proprietà? Sospetti questo comportamento quando SelectedItems era solo un membro pubblico di BindableCollection, non una proprietà. –
Ah, non mi ero reso conto che la proprietà doveva essere chiamata esplicitamente "SelectedItems" (la mia era chiamata "SelectedLanguages"). Ora ottengo un 'InvalidOperationException' lanciato nel costruttore' BindableCollection' quando faccio clic sul pulsante "Indietro" nella riga in cui il dispatcher è invocato con 'RaisePropertyChangedEventHandler'. Ho provato a inserire un blocco try/catch con 'Dispatcher.BeginInvoke' nel blocco catch, ma poi gli elementi dell'elenco non vengono riselezionati quando si torna alla pagina. – Casey