2010-05-11 7 views
10

(sinceramente ho cercato e letto tutte le "domande correlate" che mi sembravano rilevanti - spero di non aver "perso" questa domanda da altrove ma qui va ...)Dove dovrei impostare DataContext - codice dietro o xaml?

Ci sono due modi diversi (a almeno) per impostare DataContext. Uno può usare XAML o uno può usare il codice dietro.

Qual è la "migliore pratica" e perché?

Tendo a preferire impostarlo in XAML perché consente a un designer di definire le raccolte da solo, ma ho bisogno di "munizioni" sul perché è una buona pratica o perché sono pazzo e il codice che sta dietro è la bomba ..

risposta

2

Penso che dipenda da cosa si sta impostando DataContext e, in definitiva, dalle preferenze personali.

Personalmente lo faccio sempre nel codice dietro ai miei punti di vista perché lo trovo nel complesso più pulito, ed è stato il modo in cui mi è stato insegnato MVVM. Un'altra cosa da tenere a mente è che, a volte, potresti dover cambiare il tuo datacontext a seconda di cosa stai lavorando. Se questo è il caso è molto più pulito/più facile da fare nel codice retrostante piuttosto che in XAML.

0

DataContext del controllo utente/visualizzazione Suppongo? Un vantaggio nell'impostazione del contesto dei dati nel codice sottostante è la disponibilità dell'iniezione delle dipendenze. Il tuo contenitore DI può prendersi cura di eventuali dipendenze dinamicamente in fase di esecuzione.

Con questo modello, ho impostato frequentemente il disegno Blend DataContext di una vista in xaml utilizzando d: DataContext. La "versione di progettazione" può fornire dati fittizi per l'utilizzo in Blend, mentre la vera implementazione viene risolta in fase di esecuzione.

+0

sicuro che questo è il tipo di cosa che sto cercando ... Personalmente preferisco impostarlo nell'xaml. per me impostarlo nel codice dietro diventa complicato poichè * puoi * impostare il datacontext 'ovunque', quindi a volte rintracciare 'dove' è un dolore ... questo è più sulla falsariga del tipo di 'ragioni per usare un modo o un altro 'sto cercando ...(in questo caso i "dati derisi" in blend sono la "ragione") – dovholuk

4

Un terzo modo di guardare è l'utilizzo di un servizio di localizzazione. Di solito ho una classe che è responsabile della creazione di tutto il mio DataContext (VM nella maggior parte dei casi per me) e creo un'istanza di quella classe nelle risorse App.xaml. Quindi lego il DataContext nell'XAML di ogni singola pagina.

cioè

<Page DataContext="{Binding ViewModel,Source={StaticResource Locator}}" > 
1

Come si può vedere dalle risposte parere finora si articola. In verità non esiste una best practice (nel mio mondo di bontà mi vengono in mente le discusioni di "best practice", troppo giovane per le migliori pratiche da conoscere).

La realtà è che tu non è possibile impostare il "contesto dati" in Xaml. A meno che in realtà costruisce un'istanza di un oggetto in questo modo: -

<UserControl> 
    <UserControl.DataContext> 
    <local:MyDataProviderThing /> 

definitiva qualcosa di esterno deve assegnare sia la proprietà DataContext, direttamente o indirettamente tramite un'altra proprietà o via vincolante (come nella risposta di Stephan). È questo contesto esterno che determina se ha senso farlo in Xaml o no. Molte soluzioni MVVM utilizzano un'associazione in Xaml, in alcuni casi semplicemente per evitare che ci debba essere del codice nel code-behind piuttosto che essere "migliori". Altri impostano il DataContext nel codice utilizzando una classe base da cui deriva il controllo.

+0

sono confuso - il post di stephan mostra chiaramente (anche a me comunque) come impostare il datacontext via xaml così puoi chiarire cosa intendi quando dici non è possibile impostare il datacontext in xaml per favore? grazie – dovholuk

+1

@dovholuk: Nota il mio uso di "in" contesto dati ".Si puoi assegnare un oggetto alla proprietà' DataContext' in Xaml. Ma come risposta di Stephan mostra tutto ciò che viene effettivamente assegnato è un 'Binding'. non è propriamente il "contesto dati". L'oggetto reale assegnato al "contesto dati" viene eseguito in codice nella proprietà 'ViewModel' dell'oggetto assegnato a una risorsa statica chiamata' Locator'. – AnthonyWJones

Problemi correlati