2010-03-09 21 views
5

puedo establecer la relación entre la vista del modelo y de ver a través de seguir DataContext sintaxis:¿Cuál es la diferencia entre DataTemplate y DataContext en WPF?

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

Y también puedo establecer la relación entre la vista del modelo y de ver a través de seguir DataTemplate sintaxis:

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

¿Cuál es ¿la diferencia entre los dos? ¿El segundo XAML no configura el contexto de datos de una vista?

Respuesta

8

Su segunda XAML define una plantilla que se puede utilizar para mostrar un objeto del tipo viewModel:UserViewModel. No establece datos para nada, pero si se le pide a un ContentPresenter que muestre un objeto de ese tipo, usará su plantilla.

Su primer XAML configura la propiedad DataContext de su control. Define que cualquier vinculación que realice dentro de ese alcance utilizará el DataContext como la raíz del enlace (a menos que se invalide explícitamente). Para un ejemplo sencillo de DataContext en el trabajo, comparar estos dos (tanto asume que "s" es el espacio de nombres 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> 

Tanto StackPanels rendirá de forma idéntica, pero el segundo se vuelve a utilizar con mayor facilidad. (Por ejemplo: solo tiene que cambiar el enlace en un lugar si desea mostrar una fecha diferente.)

+0

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? –

+0

@Ashish: puede establecer el DataContext en el propio ViewModel, pero establece DataTemplate en una plantilla que * muestra * el ViewModel, no en el propio viewmodel. –

2

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.

Cuestiones relacionadas