El DataContext
de un FrameworkElement
es a lo que está obligado el elemento. Es fundamentalmente del tipo object
. En el patrón MVVM, este es con frecuencia el objeto ViewModel, pero no necesariamente. Es simplemente información de contexto que desea aplicar a ese FrameworkElement
. No afecta directamente a la representación visual, por sí mismo.
Cuando WPF quiere mostrar algún objeto que no tiene su propia representación visual (p. Ej., No desciende de UIElement
, verá si existe un DataTemplate
correspondiente para definir cómo debe presentar esos datos. ejemplo, usted ha dicho que la clase UserViewModel
debe presentarse con el mando a UserView
, pero que en realidad no se han creado ya sea la UserViewModel
o UserView
.
Estos dos conceptos a menudo van de la mano. Por ejemplo, imagina que tenía un ObservableCollection<object>
que tenía en él, un objeto Foo
y Bar
. Puede definir diferentes DataTemplate
s para Foo
y Bar
. Entonces podría vincular su colección a ItemsControl
. Cada objeto en el control obtendría una representación visual basada en el DataTemplate
apropiado de su tipo.
Otro ejemplo simple: si usted tiene una propiedad en su modelo de vista llamado DisplayObject
y lo único que desea que aparezca con lo DataTemplate
que ha definido, se puede utilizar el mando a ContentPresenter
:
<ContentPresenter DataContext="{Binding DisplayObject}"/>
Una vez más, estos resultados en WPF buscando la plantilla correcta para el tipo y usándola para construir una representación.
Hola Peter, Ben Gracias a todos por la respuesta. Me pregunto si puedo establecer el contexto de datos y la plantilla de datos de un control en el mismo modelo de vista? –
@Ashish: puede establecer el DataContext en el propio ViewModel, pero establece DataTemplate en una plantilla que * muestra * el ViewModel, no en el propio viewmodel. –