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.
fonte
2010-03-09 13:26:19
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? –
@Ashish: è possibile impostare DataContext sul ViewModel stesso, ma si imposta DataTemplate su un modello che * visualizza * ViewModel - non sul viewmodel stesso. –