C# 如何获取VisualParent的DataContext?
我有一个结构如下的C# 如何获取VisualParent的DataContext?,c#,togglebutton,C#,Togglebutton,我有一个结构如下的切换按钮: private void ToggleButton_Checked(object sender, System.Windows.RoutedEventArgs e) { //store settings } 我需要获得VisualParent的详细信息,特别是DataContext,我如何才能做到这一点?谢谢 更新 xaml结构如下所示: <ToggleButton Focusable="False" Width="19" Height="19"
切换按钮
:
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">
您可以使用不同的控件而不是网格。因此,请根据您的xaml结构替换它。更新:
你真的需要它吗?查看XAML,您并没有在ToggleButton中设置DataContext,所以您应该从设置其值的父级继承其值
请参阅:
此依赖项属性继承属性值。如果存在没有通过本地值或样式建立的DataContext的其他值的子元素,则特性系统将该值设置为最近的父元素的DataContext值,并指定该值
不管怎样,如果你需要它
原件:
任何假设XAML中存在给定结构的答案都是错误的。始终可以应用更改结构的模板
话虽如此,您可以使用类(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
共享xaml结构。如果它解决了您的问题,请不要忘了将其标记为答案。是否可能获取代码返回的对象的Name属性?是的。您是否正在查找网格的名称,即父网格?((发件人为System.Windows.Controls.Primitives.ToggleButton)。父项为Grid)。名称
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;
}