首页 > 解决方案 > 如何获取托管在 ContentControl 中的 UserControl 的父级?

问题描述

在 WPF 应用程序中,我有一个ContentControl. 在这个 ContentControl 中,我有一个View.

从一个特定的开始UserControl,我试图在它的逻辑树中向上,并在途中“激活”每个组件。例如,如果一个父母是 a Tab,我通过示例选择它。

我的问题是,当我UserControl在 aContentControl中时,当我调用时,LogicalTreeHelper.GetParent(...)我收到 null:

    private static void Activate(FrameworkElement frameworkElement)
    {
        //Here, in one iteration, I receive null when it's supposed to be the `ContentControl`.
        DependencyObject parent = LogicalTreeHelper.GetParent(frameworkElement); 
        if (parent is FrameworkElement parentFrameworkElement) 
        {
            Activate(parentFrameworkElement);
        }

        if (frameworkElement is DXTabItem tab)
        {
            tab.IsSelected = true;//If it's a  tab, it gets activated
        }

        frameworkElement.Focus();
    }

我的 Xaml 是这样的:

<dx:DXTabControl AllowMerging="True" TabContentCacheMode="None" Margin="0,3,0,0">
    <dx:DXTabItem Header="Some channel">
        <local:SomeControl Channel="{Binding Channel}"/>
    </dx:DXTabItem>
    <dx:DXTabItem Header="Some other view">
        <ContentControl Content="{Binding Channel, Converter={StaticResource SomeModelToViewModelConverter}}" ContentTemplateSelector="{StaticResource ConventionBasedDataTemplateSelector}" />
    </dx:DXTabItem>
</dx:DXTabControl>

所以:知道如何ContentControl从里面的控件中获取吗?

编辑这似乎与控件位于未选择的选项卡中的事实有关(我的功能的目标是激活绑定到某物的用户控件所在的选项卡)。

标签: c#wpfxamllogical-tree

解决方案


假设元素已加载并添加到可视化树中,您可以使用以下递归方法查找父元素:

private static T FindParent<T>(DependencyObject dependencyObject) where T : DependencyObject
{
    var parent = VisualTreeHelper.GetParent(dependencyObject);

    if (parent == null) return null;

    var parentT = parent as T;
    return parentT ?? FindParent<T>(parent);
}

示例用法:

DXTabItem parent = FindParent<DXTabItem>(frameworkElement); 

推荐阅读