2016-09-15 9 views
3

J'ai un ToggleButton avec cette structure:Comment obtenir le DataContext de VisualParent?

private void ToggleButton_Checked(object sender, System.Windows.RoutedEventArgs e) 
{ 
    //store settings 
} 

Je dois obtenir comment puis-je faire les détails de VisualParent, en particulier le DataContext, cela? Merci.

MISE À JOUR

La structure XAML est la suivante:

<ToggleButton Focusable="False" Width="19" Height="19" IsChecked="{Binding Path = IsFavourite}" 
        Checked="ToggleButton_Checked" Unchecked="ToggleButton_Unchecked"> 
+0

Partagez la structure xaml si possible. – Versatile

+0

N'oubliez pas de le marquer comme réponse s'il résout votre question. – Versatile

Répondre

1
((sender as System.Windows.Controls.Primitives.ToggleButton).Parent as Grid).DataContext 

Au lieu de la grille vous pouvez avoir un contrôle différent. Donc, remplacez cela selon votre structure xaml.

+0

est possible obtenir la propriété Name de l'objet renvoyé par votre code? – AgainMe

+0

Oui. Recherchez-vous le nom du parent Grid, c'est-à-dire parent? ((expéditeur sous System.Windows.Controls.Primitives.ToggleButton) .Parent as Grid) .Name – Versatile

0

MISE À JOUR:

En avez-vous vraiment besoin? En regardant votre XAML, vous ne définissez pas DataContext dans votre ToggleButton, vous devriez donc hériter de sa valeur de n'importe quel parent qui définit sa valeur.

Voir: DataContext.

Cette propriété de dépendance hérite des valeurs de propriété. S'il existe des éléments enfants sans autres valeurs pour DataContext établies à l'aide de valeurs ou de styles locaux, le système de propriété attribue la valeur DataContext de l'élément parent le plus proche à cette valeur.

Quoi qu'il en soit, si vous en avez besoin ...

ORIGINAL: Toute réponse qui suppose une structure donnée dans votre XAML est erroné. Vous pouvez toujours appliquer un modèle qui modifie la structure. Cela dit, vous pouvez utiliser la classe VisualTreeHelper (méthode GetParent) pour naviguer dans l'arborescence visuelle. Et le premier paramètre, est une référence au contrôle qui a été vérifié.

Alors, du haut de ma tête, je suppose que vous pouvez faire ce qui suit:

DependencyObject source = sender as DependencyObject; 
if(null != source) { 
    DependencyObject parent = VisualTreeHelper.GetParent(source); 
    FrameworkElement parentElement = parent as FrameworkElement; 
    if(null != parentElement) { 
     object context = parentElement.DataContext; 
    } 
} 

Vous devez en tenir cela dans une méthode d'assistance:

public static FrameworkElement GetParentContext(FrameworkElement element) { 
    object result = null; 
    DependencyObject parent = VisualTreeHelper.GetParent(element); 
    FrameworkElement parentElement = parent as FrameworkElement; 
    if(null != parentElement) { 
     result = parentElement.DataContext; 
    } 
    return result;   
} 

S'il vous plaît considérer que, étant donné que la La structure XAML peut être différente, peut-être aurez-vous besoin de remonter l'arbre jusqu'à ce que vous trouviez un élément avec DataContext qui n'est pas null.