2009-10-05 24 views
26

Deseo poder crear una instancia del objeto DataContext para mi ventana WPF StartupUri en XAML, en lugar de crearlo y luego configurar la propiedad DataContext de forma programática.Cómo crear una instancia del objeto DataContext en XAML

La razón principal es que no necesito acceder al objeto creado externamente y no quiero tener que escribir código detrás solo para configurar el DataContext.

Estoy seguro de que he leído en alguna parte cómo una instancia del objeto DataContext en XAML, pero no puedo encontrar en cualquiera de los lugares habituales ...

Respuesta

31

Se agrega un espacio de nombres XML para cualquier espacio de nombres de su DataContext vive en, crear una instancia del mismo en los recursos de la ventana y establecer el DataContext a ese recurso:

<Window x:Class="WpfApplication4.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:WpfApplication4" 
    Title="Window1" Height="300" Width="300"> 
    <Window.Resources> 
     <local:MyViewModel x:Key="MyViewModel"/> 
    </Window.Resources> 
    <Grid DataContext="{StaticResource MyViewModel}"> 

    </Grid> 
</Window> 
+0

¿Funciona esto en .NET framework 4.5? Intenté este código y dice ... 'No se encontró el tipo 'local: MyViewModel'. Verifique que no le falta un ensamblaje y que todos los ensamblados a los que se hace referencia se han construido. –

+0

@ RafafTahsin ¿se aseguró de tener el espacio de nombre correctamente? Además, si agregó el tipo al que se hace referencia al proyecto pero aún no lo ha creado, el diseñador de WPF se confunde un poco. ¿Has intentado construir? – Randolpho

27

Usted sólo puede especificar esta directamente en XAML para toda la ventana:

<Window 
    ... xmlns definitions ... 
> 
    <Window.DataContext> 
     <local:CustomViewModel /> 
    </Window.DataContext> 
</Window> 

Esto crea un modelo de vista llamado "CustomViewModel" en el espacio de nombres con alias a local, directamente como el DataContext para la ventana.

15

Asumiendo este código:

public abstract class BaseView { } 
public class RuntimeView : BaseView { } 
public class DesigntimeView : BaseView { } 

Prueba esto:

<Page.DataContext> 
    <local:RuntimeView /> 
</Page.DataContext> 
<d:Page.DataContext> 
    <local:DesigntimeView /> 
</d:Page.DataContext> 
<ListBox ItemsSource="{Binding}" /> 

mejor de las suertes!

+1

+1 porque muestra el tiempo de ejecución y el tiempo de diseño, y no hace uso de x: Key, sino que coloca el DataContext directamente en el elemento al que pertenece – stijn

0

Si es necesario establecer DataContext como misma clase de control:

<Window x:Class="TabControl.MainWindow" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
      xmlns:local="clr-namespace:TabControl" 
      Title="MainWindow" Height="350" Width="525" 
      DataContext="{Binding RelativeSource={RelativeSource Self}}"   
      > 
</Window> 

utilizar el enlace de RelativeSource.

o simplemente

 <Window x:Class="TabControl.MainWindow" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
       xmlns:local="clr-namespace:TabControl" 
       Title="MainWindow" Height="350" Width="525"       
       > 
<Window.DataContext> 
< new instance of any viewModel here....> 
</Window.DataContext> 
    </Window> 

Si desea asignar una instancia de una clase diferente de sí mismo.

Cuestiones relacionadas