如何获取VisualParent的DataContext?

时间:2016-09-15 13:43:15

标签: c# togglebutton

我有ToggleButton这种结构:

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

我需要了解VisualParent的详细信息,特别是DataContext,我该怎么做?感谢。

更新

xaml结构是这样的:

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

2 个答案:

答案 0 :(得分:1)

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

您可以使用不同的控件来代替网格。所以根据你的xaml结构替换它。

答案 1 :(得分: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的元素为止}。