È improprio disporre di un'estensione dell'applicazione per il collegamento a discesa

2

Il Combobox WPF deve associare una raccolta alla sua ItemsSource e qualcosa a cui legare l'oggetto o il valore selezionato. Fino ad ora, ho incluso sia la collezione che le proprietà del valore selezionato che sto vincolando al ViewModel responsabile della vista che ospita il Combobox.

Ultimamente, ho esaminato come ho implementato MVVM nei miei progetti precedenti e ho notato alcune cose di cui non sono soddisfatto. Uno di questi è che se più viste richiedono lo stesso ComboBox, allora ogni ViewModel associato ha la propria copia della collezione. Stavo pensando che sarebbe stato meglio esporre la raccolta a livello di applicazione e fornire solo una proprietà per legare il valore selezionato in ogni ViewModel pertinente.

Il modo in cui vedo che funziona è avere un singleton ViewModel che viene tenuto in vita per tutta la durata dell'applicazione. Questo ViewModel avrebbe tutte le collezioni standard che non sono specifiche per singoli ViewModels.

Poiché sto utilizzando Entity Framework, avrebbe il proprio contesto, quindi le proprietà dell'elemento selezionato dovrebbero associarsi alla chiave esterna dell'entità anziché alla proprietà di navigazione poiché i vari ViewModels non condividono i contesti.

Da lì, potrei incapsulare le varie collezioni all'interno di un ResourceDictionary come un insieme di StaticResources, e quindi usarle per legare all'ArticoloSource di vari ComboBox in tutta l'applicazione.

La mia domanda è questa; Questo è pazzo / stupido? Ho insegnato a me stesso WPF / MVVM da una serie di fonti e non sono mai sicuro se mi sto allontanando da pratiche generalmente accettate.

Il mio pensiero dietro tutto ciò era che avere una sola fonte consentirebbe a più modelli di vista di avere un insieme sincronizzato di raccolte a cascata. Se cambio la raccolta in un punto, il resto mostrerebbe le stesse modifiche, poiché sono tutte legate a una fonte. Prima, avevo bisogno di un mediatore per mantenere la coerenza tra ViewModels.

Inoltre, fornirebbe una classe singleton semplice, centralizzata e collegabile per memorizzare le variabili con scope dell'applicazione, come l'utente attualmente connesso.

Quindi, c'è un difetto evidente in questo che potrei mancare? In passato, ho implementato il mio pattern MVVM senza alcuna convalida esterna. Funziona, con solo pochi dolori in crescita ... ma sono sicuro che avrebbe potuto trarre grandi benefici da qualche peer review.

    
posta Chronicide 25.06.2014 - 22:50
fonte

2 risposte

1

non dovrebbe esserci alcun problema nel vincolare ItemSource di più caselle combinate a un elenco statico di opzioni, a condizione che il valore SelectedValue sia associato a ciascuna istanza del modello. Prendiamo ad esempio un elenco a discesa degli Stati Uniti, tutte le istanze dovrebbero provenire da una raccolta a livello di applicazione.

    
risposta data 19.01.2017 - 18:38
fonte
0

Un ViewModel è un modello destinato a una vista specifica. L'idea di avere un ViewModel "comune" condiviso tra le visualizzazioni è contro questa idea.

Se scopri che molti dei tuoi ViewModels hanno elementi in comune, ti suggerisco di implementare una buona ereditŕ vecchia maniera. È possibile disporre di un BaseViewModel con membri per il recupero e la compilazione di caselle combinate di vari tipi e ciascun ViewModels che richiede tali membri può semplicemente ereditare da BaseViewModel. Si può anche finire con più di un ramo ereditario; ad esempio, potresti avere un CustomerViewModel, che contiene le caselle combinate richieste da un cliente, e un AdminViewModel separato, che contiene le caselle combinate richieste dagli amministratori, ad es. una casella combinata per "Ruolo utente"

Una cosa nel tuo post che mi turba-- tu scrivi di ogni viale ViewModel la sua copia di una collezione. Non sono sicuro che sia accurato. Un ViewModel viene creato quando arriva la richiesta per la vista, e viene distrutto dopo che la richiesta è stata elaborata e una risposta è stata restituita. L'idea che ci siano tutti questi diversi ViewModels che mantengono una collezione allo stesso tempo non sembra accurata quando si considera questo contesto.

    
risposta data 20.01.2017 - 00:18
fonte

Leggi altre domande sui tag