2016-09-15 27 views
3

我有一个ToggleButton这种结构:如何获取VisualParent的DataContext?

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

我需要得到的VisualParent的细节,特别是DataContext,我该怎么办呢?谢谢。

UPDATE

的XAML结构是这样的:

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

如果可能的话,共享xaml结构。 – Versatile

+0

如果它解决了您的问题,请不要忘记标记为答案。 – Versatile

回答

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

而是电网的你可以有不同的控制。所以根据你的xaml结构来替换它。

+0

是否可能获取代码返回的对象的Name属性? – AgainMe

+0

是的。你在寻找网格的名字,即父母吗? ((发件人为System.Windows.Controls.Primitives.ToggleButton).Parent as Grid).Name – Versatile

0

更新:

你真的需要它吗?看看你的XAML,你并没有在你的ToggleButton中设置DataContext,所以你应该从设置它的值的父母继承它的值。

参见:DataContext

此依赖项属性继承属性值。如果通过本地值或样式创建的DataContext没有其他值的子元素,那么属性系统会将该值设置为指定此值的最近父元素的DataContext值。

无论如何,如果你需要它...

ORIGINAL: ,它假定在XAML中给定的结构是错误的任何答案。您始终可以应用更改结构的模板。

话虽如此,您可以使用VisualTreeHelper类(GetParent方法)来导航可视化树。第一个参数是对被检查的控件的引用。

所以,从我的头顶,我想你可以做到以下几点:

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; 
    } 
} 

你应该在一个辅助方法不会考虑此因素:

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;   
} 

请考虑鉴于XAML结构可能与不同,也许您需要走到树上,直到找到DataContext不是null的元素。

相关问题