2008-11-17 7 views
14

J'ai un contrôle utilisateur où le XAML du contrôle peut se lier aux propriétés appropriées du contexte de données du parent comme normal (le contexte de données se propage dans xaml). Par exemple, j'ai une fenêtre dont le paramètre DataContext est paramétré par exemple sur ObjectA. Mon contrôle utilisateur dans la fenêtre est alors essayer d'accéder aux propriétés dans le dataContextDataContext du contrôle utilisateur WPF est nul

Donc xaml et le code de ma fenêtre peuvent tous deux voir un DataContext non nul.

Mon contrôle que DataContext propage à peut voir un DataContext non nul dans le Xaml mais pas dans le code derrière.

Quelle est la bonne façon de gérer cela?

Répondre

19

défaut si vous devez vérifier si le DataContext est défini, vous pouvez utiliser le 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 
    } 
} 

Notez qu'il entrer dans l'habitude UserControl1_DataContextChanged jusqu'à ce que DataContext change de zéro à une valeur différente.

Vous ne savez pas si cela répond à votre question, mais peut être très pratique à utiliser dans les problèmes de débogage.

+1

J'ai dû m'abonner à l'événement DataContextChanged avant InitializeComponent pour pouvoir gérer l'événement lors du premier DataContext. – Darlene

+0

Fonctionne également: DataContextChanged + = UserControl1_DataContextChanged; – Skychan

11

Je pense que vous vérifiez le 'DataContext' dans le constructeur de UserControl. Il sera nul au Constructeur puisque le contrôle de l'utilisateur n'a pas encore été créé alors que l'exécution est dans le code du constructeur. Mais vérifiez la propriété à l'événement Loaded, vous verrez l'objet correctement.

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. Je le vérifie dans le contexte de la classe. –

+0

Vous ne savez pas si quelque chose a changé depuis cette réponse - mais l'événement Loaded a un contexte NULL. – Pakk

+0

Dans mon programme (.NET Framework 4.6.2), DataContext est en fait initialisé après l'exécution de InitializeComponent. – blearyeye

10

Je vérifie pour voir si vous avez une erreur de liaison à l'exécution. Ajouter cet espace de noms à votre XAML:

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

et vérifiez la fenêtre de sortie du débogueur pour les messages d'erreur pertinents.

Sinon, pouvez-vous nous montrer plus de code?

+1

Merci ... c'est gentil ... J'aurais aimé l'avoir trouvé il y a quelques semaines ... lol. –

+0

Merci, merci, merci .... jour == enregistré –

+0

Heureux que cela ait fait une grande différence. Et merci pour l'upvote. – hughdbrown

Questions connexes