2008-11-17 16 views
14

Tengo un control de usuario donde el XAML del control se puede unir a las propiedades apropiadas del contexto de datos del padre como normal (el contexto de datos se propaga en xaml).WPF User Control DataContext es nulo

Por ejemplo, tengo una ventana cuyo DataContext estoy configurando a ObjectA, por ejemplo. Mi control de usuario dentro de la ventana es entonces intentar acceder a las propiedades dentro del dataContext

Por lo tanto, el xaml y el código de mi ventana pueden ver un DataContext no nulo.

Mi control que se propaga a través de DataContext puede ver un DataContext no nulo en el Xaml pero no en el código subyacente.

¿Cuál es la forma correcta de manejar esto?

Respuesta

19

en su defecto, si es necesario comprobar si el DataContext se está creando puede utilizar el DataContextChanged

public partial class UserControl1 : UserControl 
{ 
    public UserControl1() 
    { 
     InitializeComponent(); 

     DataContextChanged += new DependencyPropertyChangedEventHandler(UserControl1_DataContextChanged); 
    } 

    void UserControl1_DataContextChanged(object sender, DependencyPropertyChangedEventArgs e) 
    { 
     // You can also validate the data going into the DataContext using the event args 
    } 
} 

Nota no lo puedo entrar UserControl1_DataContextChanged hasta DataContext se cambia de cero a un valor diferente.

No estoy seguro si esto responde a su pregunta, pero puede ser bastante útil para usar en problemas de depuración.

+1

Tuve que suscribirme al evento DataContextChanged antes de InitializeComponent para poder manejar el evento la primera vez que se configuró DataContext. – Darlene

+0

También funciona para hacer: DataContextChanged + = UserControl1_DataContextChanged; – Skychan

11

Creo que está comprobando el 'DataContext' en el constructor del UserControl. Será nulo en el Constructor ya que el control del usuario aún no se ha creado mientras la ejecución está en el código del constructor. Pero revise la propiedad en el evento Loaded para ver el objeto correctamente.

public partial class UserControl1 
{ 
    public UserControl1() 
    { 
     this.InitializeComponent(); 

     //DataContext will be null here 
     this.Loaded += new RoutedEventHandler(UserControl1_Loaded); 
    } 

    void UserControl1_Loaded(object sender, RoutedEventArgs e) 
    { 
     //Check DataContext Property here - Value is not null 
    } 
} 
+0

noope. Lo estoy verificando dentro del contexto de la clase. –

+0

No estoy seguro de si ha cambiado algo desde esta respuesta, pero el evento cargado tiene un contexto de NULO. – Pakk

+0

En mi programa (.NET Framework 4.6.2), DataContext se inicializa de hecho después de que InitializeComponent se ejecuta. – blearyeye

10

Verificaría si tiene un error de enlace en el tiempo de ejecución. Agregue este espacio de nombres a su XAML:

xmlns:debug="clr-namespace:System.Diagnostics;assembly=System" 

y revise la ventana Salida del depurador para ver los mensajes de error pertinentes.

Como alternativa, ¿nos puede mostrar más código?

+1

Gracias ... esto es dulce ... Desearía haberlo encontrado hace semanas ... jaja. –

+0

Gracias, gracias, gracias ... día == guardado –

+0

Me alegro de que haya una gran diferencia. Y gracias por el voto popular. – hughdbrown