2008-11-17 18 views
14

Ich habe ein Benutzersteuerelement, wo das XAML des Steuerelements wie normal an den entsprechenden Eigenschaften aus dem Datenkontext des übergeordneten Elements binden kann (der Datenkontext wird in Xaml propagiert).WPF-Benutzersteuerelement DataContext ist Null

Zum Beispiel habe ich ein Fenster, dessen DataContext ich zum Beispiel auf ObjectA setze. Meine Benutzerkontrolle innerhalb des Fensters versucht dann, auf die Eigenschaften im dataContext zuzugreifen

So mein Fenster xaml und Code hinter kann einen Nicht-Null-DataContext sehen.

Mein Steuerelement, zu dem DataContext weitergegeben wird, kann einen Nicht-Null-DataContext im Xaml, jedoch nicht im Code dahinter, sehen.

Wie ist der richtige Umgang damit?

Antwort

19

in Ermangelung eines solchen, wenn Sie müssen prüfen, ob die Datacontext festgelegt wird, um Ihnen die 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 
    } 
} 

Hinweis verwenden können es UserControl1_DataContextChanged gewohnt eingeben, bis von null Datacontext auf einen anderen Wert geändert wird.

Nicht sicher, ob dies Ihre Frage beantwortet, aber in Debugging-Fragen recht praktisch sein kann.

+1

Ich musste das DataContextChanged-Ereignis vor InitializeComponent abonnieren, damit ich das Ereignis beim ersten Mal DataContext verarbeiten konnte. – Darlene

+0

Funktioniert auch zu tun: DataContextChanged + = UserControl1_DataContextChanged; – Skychan

11

Ich denke, Sie überprüfen den 'DataContext' im Konstruktor des UserControl. Es wird NULL im Konstruktor sein, da das Benutzersteuerelement noch nicht erstellt wurde, während die Ausführung im Konstruktorcode ist. Aber überprüfen Sie die Eigenschaft bei Loaded Event Sie sehen das Objekt richtig.

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. Ich überprüfe es im Kontext der Klasse. –

+0

Nicht sicher, ob sich seit dieser Antwort etwas geändert hat - aber Loaded-Ereignis hat einen Kontext von NULL. – Pakk

+0

In meinem Programm (.NET Framework 4.6.2) wird DataContext tatsächlich initialisiert, nachdem InitializeComponent ausgeführt wurde. – blearyeye

10

Ich würde überprüfen, ob Sie zur Laufzeit einen verbindlichen Fehler haben. Fügen Sie diesen Namespace zu Ihrem XAML hinzu:

und überprüfen Sie das Ausgabefenster des Debuggers auf relevante Fehlermeldungen.

Alternativ können Sie uns mehr Code zeigen?

+1

Danke ... das ist süß ... Ich wünschte, ich hätte das vor Wochen gefunden ... lol. –

+0

Danke, danke, danke .... Tag == gespeichert –

+0

Froh, dass es einen großen Unterschied gemacht hat. Und danke für die Verbesserung. – hughdbrown