2010-03-09 25 views
5

posso impostare il rapporto tra Mostra modello e vista attraverso seguente DataContext sintassi:Qual è la differenza tra DataTemplate e DataContext in WPF?

<UserControl.DataContext> 
    <view_model:MainMenuModel /> 
</UserControl.DataContext> 

E posso anche impostare il rapporto tra Mostra modello e vista attraverso seguente DataTemplate sintassi:

<DataTemplate 
     DataType="{x:Type viewModel:UserViewModel}"> 
     <view:UserView /> 
    </DataTemplate> 

Che cosa è la differenza tra i due? Il secondo XAML non imposta il contesto dati di una vista?

risposta

8

Il secondo XAML definisce un modello che può essere utilizzato per visualizzare un oggetto di tipo viewModel:UserViewModel. Non imposta i dati per qualsiasi cosa, ma, se un ContentPresenter viene chiesto di visualizzare un oggetto di quel tipo, userà il modello.

Il tuo primo XAML è l'impostazione della proprietà DataContext del vostro controllo. Definisce che eventuali attacchi si eseguono all'interno di tale portata utilizzeranno il DataContext come la radice del legame (se non esplicitamente sovresposta). Per un semplice esempio di DataContext sul lavoro, confrontare questi due (entrambi supporre che "s" è il namespace System):

<StackPanel> 
    <TextBlock Text="{Binding Day, Source={x:Static s:DateTime.Now}}" /> 
    <TextBlock Text="{Binding Month, Source={x:Static s:DateTime.Now}}" /> 
    <TextBlock Text="{Binding Year, Source={x:Static s:DateTime.Now}}" /> 
</StackPanel> 

<StackPanel DataContext="{Binding Source={x:Static s:DateTime.Now}}"> 
    <TextBlock Text="{Binding Day}" /> 
    <TextBlock Text="{Binding Month}" /> 
    <TextBlock Text="{Binding Year}" /> 
</StackPanel> 

Entrambi StackPanels renderanno identico, ma il secondo è più facilmente riutilizzato. (Es .: è sufficiente cambiare il legame in un unico luogo, se si voleva visualizzare una data diversa.)

+0

Ciao Peter, Ben Grazie a tutti voi per la risposta. Mi chiedo se posso impostare il datacontext e il datatemplate di un controllo sullo stesso modello di vista? –

+0

@Ashish: è possibile impostare DataContext sul ViewModel stesso, ma si imposta DataTemplate su un modello che * visualizza * ViewModel - non sul viewmodel stesso. –

2

La DataContext di un FrameworkElement è ciò che l'elemento è associato. È fondamentalmente di tipo object. Nel modello MVVM, questo è più frequentemente l'oggetto ViewModel, ma non è necessario. Sono semplicemente alcune informazioni di contesto che si desidera applicare a tale FrameworkElement. Non influisce direttamente sulla rappresentazione visiva, da solo.

Quando WPF vuole visualizzare un oggetto che non ha di essa la propria rappresentazione visiva (ad esempio non discende da UIElement, si cercherà di vedere se un corrispondente DataTemplate esiste per definire come si dovrebbe presentare i dati. Nel vostro esempio, lei ha detto che la classe UserViewModel deve essere presentata utilizzando il controllo UserView, ma non hanno effettivamente creato sia la UserViewModel o UserView.

Questi due concetti spesso vanno insieme. Per esempio, immaginate si ha avuto un ObservableCollection<object> che aveva in un Foo e un oggetto Bar. si potrebbe definire diversi DataTemplate s per Foo e Bar. Quindi puoi associare la tua collezione a ItemsControl. Ogni oggetto nel controllo otterrebbe una rappresentazione visiva basata sull'appropriato DataTemplate dal suo tipo.

Un altro semplice esempio: se si dispone di una proprietà sulla vostra ViewModel chiamato DisplayObject e si vuole semplicemente che appaia con qualunque DataTemplate è stato definito, è possibile utilizzare il controllo ContentPresenter:

<ContentPresenter DataContext="{Binding DisplayObject}"/> 

Anche in questo caso, questo risultato in WPF cercare il modello corretto per il tipo e utilizzarlo per costruire una rappresentazione.

Problemi correlati