2013-06-07 13 views
6

In MainWindow abbiamo:Josh Smith MVVM Demo

<HeaderedContentControl 
      Content="{Binding Path=Workspaces}" 
      ContentTemplate="{StaticResource WorkspacesTemplate}" 
      Header="Workspaces" 
      Style="{StaticResource MainHCCStyle}" 
      /> 

Negli risorse:

<DataTemplate x:Key="WorkspacesTemplate"> 
    <TabControl 
     IsSynchronizedWithCurrentItem="True" 
     ItemsSource="{Binding}" 
     ItemTemplate="{StaticResource ClosableTabItemTemplate}" 
     Margin="4" 
     /> 
    </DataTemplate> 

E nel articolo dice:

A DataTemplate digitato non ha a x: valore chiave assegnato ad esso, ma ha la sua proprietà DataType impostata su un'istanza della classe Tipo . Se WPF cerca di rendere uno dei tuoi oggetti ViewModel, sarà controllo per vedere se il sistema di risorse ha un DataTemplate digitato in ambito cui tipo di dati è la stessa (o una classe base di) il tipo di ViewModel opporsi . Se ne trova uno, utilizza tale modello per il rendering dell'oggetto ViewModel a cui fa riferimento la proprietà Contenuto dell'elemento di tabulazione.

La mia domanda è:

Come si fa il modello sa che il tipo è un insieme di aree di lavoro (WorkspaceViewModel)?

risposta

4

Non è necessario, nel codice che hai postato. Nel tuo esempio, hai dato un valore rigoroso al modello di contenuto: hai esplicitamente utilizzato {StaticResource WorkspacesTemplate}, quindi una risorsa con la chiave di "WorkspacesTemplate viene visualizzata.

Poiché hai impostato il modello in modo esplicito, non importa quale sia il tipo previsto: proverà a visualizzare qualsiasi oggetto nel tuo Content utilizzando il modello che hai impostato, con vari gradi di successo se usa un tipo che non corrisponde!

Nel metodo alternativo si cita - con un "DataTemplate" digitato, dichiarare il proprio datatemplate con <DataTemplate DataType="{x:Type l:WorkSpace}" />. Notare che non esiste x:Key (e anche che ho assunto che tu abbia uno spazio nomi l mappato al tuo codice locale). Quello che succede qui è che WPF imposta automaticamente la chiave della risorsa su DataType (importante notare: una chiave di risorsa non deve essere una stringa!).

Quindi, quando si dichiara HeaderedContentControl, è possibile tralasciare l'impostazione di ContentTemplate. Durante il runtime, quando viene eseguito il rendering del controllo, WPF controllerà il tipo dell'oggetto Content e scoprirà che è WorkSpace e quindi cercherà una risorsa con x:Key="{x:Type l:WorkSpace}", che corrisponderà al modello digitato.

Questo è un modo utile di effettuare rappresentazioni coerenti dei dati in tutta l'applicazione, dal momento che un DataTemplate digitato verrà utilizzato automaticamente da qualsiasi contenuto che presenta il controllo in tutta l'applicazione.

4

WPF non si preoccupa molto del tipo di calcestruzzo, è solo bisogno di essere un IEnumerable di qualcosa, WPF utilizza il descrittore di tipi per sapere con cosa l'ui si lega.

+0

In alcune definizioni di template ho visto questo (nello stesso progetto): Che cos'è TargetType? – Sturm

+1

Quando si aggiunge il tipo di destinazione non è necessario specificare il modello nel controllo elementi, wpf cercherà automaticamente un modello con il tipo di target relvant, è solo un'altra opzione. La migliore pratica è usare entrambi. –