2012-03-04 16 views
10

Sto cercando di trovare il modo migliore per associare Views e ViewModels in MVVM e ho optato per l'approccio ViewModel utilizzando typed DataTemplates, come descritto in this article e in this answer. Sto usando Prism e ho più moduli che hanno i loro propri progetti/librerie di classi.Dove dovrei definire i miei datatemplates?

La mia domanda è: Dove dovrebbero vivere i miei DataTemplates nella mia soluzione?

  1. Devo mettere i DataTemplates in un dizionario risorse che vive nello stesso progetto che ha le tipi/ViewModels rende?
  2. Devo inserire i DataTemplates in un dizionario di risorse che risiede nel progetto che ha la MainWindow dell'applicazione (cioè Shell.xaml)?
  3. Questi dizionari delle risorse dovrebbero quindi essere aggiunti a App.Current.MainWindow.Resources.MergedDictionaries?

Spero che questa informazione sia sufficiente per descrivere quello che sto cercando di fare.

Aggiornamento: vedere i commenti della risposta selezionata.

risposta

2

Sono sicuro che il modo migliore qui è utilizzare il file di risorse Themes \ Generic.xaml. Questo è il file (dovrebbe essere esattamente nella cartella Temi e ha il nome esattamente Generic.xaml) utilizzato dal motore di temi WPF/Silverlight e contiene risorse condivise attraverso l'intera applicazione. Puoi anche creare un file separato nella cartella Temi con nome come Generic.DataTemplates.xaml e aggiungere il link ad esso da Generic.xaml. Google sa molto di generic.xaml o puoi vedere più dettagli nella mia risposta qui: WPF Prism - Where to put Resources?

+0

Ehi, grazie per il tuo suggerimento. Ho letto quel post qualche tempo fa e uso il metodo che Rachel descrive lì. Ho un progetto di infrastruttura con una cartella Temi in cui memorizzo i miei stili in 'Dizionari risorsa '. Il problema è che questo progetto di infrastruttura è referenziato da tutti i miei altri progetti/moduli. Per utilizzare 'DataTemplates' digitati, avrò bisogno di riferimenti ai progetti che contengono i miei ViewModels, il che significherebbe creare una dipendenza circolare. Devo creare un progetto separato per contenere solo 'DataTemplates'? –

+1

Penso che tu possa creare solo i temi della cartella nell'assieme del tuo modulo. Faccio questo modo nel progetto attuale - Ho condiviso i modelli in un assembly UI separato e quasi l'assemblaggio di ogni modulo ha la sua cartella Themes – chopikadze

+0

Ok, sembra proprio la strada da percorrere! Grazie, apprezzo il tuo consiglio. Vedrò se riesco a farlo funzionare. –

2

Aggiornato per spiegare più chiaramente.

Dirò se il DataTemplate è generico: i.e Si dispone di un controllo utente che si collega a un ViewModel e che ViewModel dispone di BaseViewModel, che espone una sorta di proprietà. Your DataTemplate sta visualizzando tali proprietà. Quindi puoi usare questo DataTemplate su ogni ViewModel che implementa il BaseViewModel.

È meglio inserirlo in App.xaml, quindi sarà possibile estrarlo con la chiave e applicarlo in un altro punto del progetto.

Ma se il vostro DataTemplate è molto specifico,

cioè v'è un controllo utente che si lega solo sulla proprietà specificata in questo ViewModel e si sa nessun altro controllo si lega a quella ViewModel, si vuole mettere in lo stesso file Xaml Resources o dove si definisce il proprio UserControl.

+0

Capisco che posso usare 'DataTemplates' per personalizzare la visualizzazione dei dati in esempio, un' ListBox' e posso riutilizzare questo 'DataTemplate' e applicarlo a più' ListBoxes' facendo riferimento al suo 'x: Key'. Ma secondo l'articolo di Josh Smith (vedi sopra), credo di poter usare anche ** typed ** 'DataTemplates' per accoppiare un View/UserControl ad un' ViewModel'. Cioè se aggiungo un oggetto ViewModel a un 'ListBox', WPF renderizzerà ViewModel usando UserControl specificato in' DataTemplate' (invece di usare ToString()). Sono lontano qui? –

+0

@Angavar Sì, è anche possibile utilizzare DataTemplate digitato per applicarlo. Sto solo dando un esempio di come puoi usare la loro x: Key estraendo il Template, Style, ecc. –

0

Secondo Microsofts App Studio i DataTemplates dovrebbero vivere in una sottodirectory DataTemplates sotto la Directory Viste. Un'app universale ha questa directory sia per l'interfaccia utente di Windows che per l'interfaccia utente di Windows Phone, quindi non è nel progetto condiviso perché non sono uguali. Non utilizzare l'architettura Converge PRISM. È completamente sbagliato progettato! Questo non è stato scritto pensando all'architettura Windows e Windows Phone, ma come lo chiamano Converged. Dovrebbe essere stato completamente ridisegnato come funziona in Microsofts App Studio. Non cercare in Dipendenza Iniezione non è in esso e non è necessario. La maggior parte usa Iniezione delle dipendenze per le interfacce stub o false. Il DataContext per i dati di progettazione funziona ora così bene con i dati JSON che un componente di Iniezione di dipendenza sarebbe eccessivo.

Problemi correlati