2010-01-22 5 views
1

J'ai une fenêtre WPF normale, appelons-la TopLevel qui a un tas de contrôles, notamment ListView qui devrait enregistrer certains événements dans différents éléments de l'application.WPF: événement routé personnalisé avec des informations supplémentaires

Supposons donc que j'ai un Grid dans TopLevel qui contient un tas de commandes utilisateur appelées Task. Chaque Task a un objet associé à eux en tant que propriété publique, appelons-le Order, ainsi qu'une case à cocher standard.

Maintenant, je veux TopLevel recevoir un événement chaque fois que l'utilisateur vérifie une case à cocher dans un Task, mais l'événement doit contenir l'objet Order aussi, donc je peux travailler avec elle de TopLevel pour le mettre dans le journal des événements.

Comment faire cela? Je devine que je veux utiliser des événements routés pour cela, mais je ne peux pas comprendre comment obtenir la case à cocher cliquer pour "trouver" Order pour l'envoyer vers le haut à TopLevel.

+0

Avez-vous eu ce travail? – TabbyCool

+0

@TabbyCool: J'ai décidé de chercher d'autres options avant de décider d'utiliser ou non votre méthode. Je vais vous donner la "bonne réponse" de toute façon. –

+0

Merci, haha! Avez-vous trouvé quelque chose de prometteur? Je serais intéressé de voir comment vous implémenter ceci si vous décidez d'une solution alternative :-) – TabbyCool

Répondre

1

Que diriez-vous quelque chose comme ça ...

private void CheckBox_Checked(object sender, RoutedEventArgs e) 
    { 
     CheckBox checkBox = sender as CheckBox; 
     Task task = FindParentTask(checkBox); 
     Order order = task.Order; 
    } 

Puisque vous devez parcourir l'arbre visuel pour se rendre à la tâche, vous pouvez essayer un peu de récursion ...

public FrameworkElement FindParentTask(FrameworkElement element) 
    { 
     if (element.Parent.GetType() == typeof(Task)) 
      return element.Parent as FrameworkElement; 
     else 
      return FindParentTask(element.Parent as FrameworkElement); 
    } 

Je viens de tester cette méthode pour récupérer le parent Expander pour un CheckBox sur un de mes UserControls, c'est plusieurs niveaux dans l'arborescence visuelle, imbriqués dans un tas de StackPanels, Grids et DockPanels, travaillé un régal.

+0

Donc je peux juste convertir un 'DependencyObject' dans n'importe quel type que je veux comme ça? –

+0

Faites-vous référence à checkBox.Parent? Si l'objet sous-jacent est déjà de type Task, alors oui, je le pense. Avez-vous un échantillon de votre code? Ne peut pas faire de mal pour l'essayer cependant, ce n'est que quelques lignes :-) – TabbyCool

+0

Aussi, la case à cocher n'est pas l'enfant immédiat de la 'Task' donc je devrais traverser vers le haut d'une certaine manière pour arriver à la' Task' . –

Questions connexes