微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

WPF TabItems 没有父级

如何解决WPF TabItems 没有父级

我通过绑定创建 TabItems 并尝试访问 parent TabControl 中的 TabItemDrop
但是,在放置事件的情况下,来自源的父级始终为 null。如果我自己创建 TabItems,它可以工作。

.xaml

<TabControl ItemSource="{Binding TabItemList}">
    <TabControl.Resources>
        <Style targettype="TabItem">
            <Setter Property="AllowDrop" Value="True" />
            <EventSetter Event="PreviewMouseMove" Handler="TabItemPreviewMouseMove" />
            <EventSetter Event="Drop" Handler="TabItemDrop" />
        </Style>
    </TabControl.Resources>
    <TabControl.ItemTemplate>
        <DataTemplate>
            <Label Content="{Binding Header}">
        </DataTemplate>
    </TabControl.ItemTemplate>
    <TabControl.ContentTemplate>
        <DataTemplate>
            <Label Content="{Binding Body}">
        </DataTemplate>
    </TabControl.ContentTemplate>
</TabControl>


隐藏代码 (.xaml.cs):

private void TabItemDrop(object sender,DragEventArgs e)
{
    TabItem tabItem = e.source as TabItem;
    if(tabItem.Parnent == null){
        //Always null,expect to get the tabControl here
    }
}

解决方法

FrameworkElement.Parent 指向控件的逻辑父级。将 TabControl 的 ItemsSource 属性绑定到数据对象后,TabControl 将生成可视化数据元素的项目容器控件 (TabItem)。在这种情况下,每个容器控件 (TabItem) 都不是 TabControl 的逻辑子项;虽然它是视觉孩子。

为了得到父 TabControl(无论如何),遍历可视化树,例如:

private void TabItemDrop(object sender,DragEventArgs e)
{
    TabItem tabItem = e.Source as TabItem;

    DependencyObject parent = VisualTreeHelper.GetParent(tabItem);

    while (parent != null)
    {
        if (parent is TabControl)
        {
            break;
        }

        parent = VisualTreeHelper.GetParent(parent);
    }

    if (parent != null)
    {
        //Got the tabControl here
    }
}
,

@Bgorski 正确地描述了一切。 但我想提供另一种解决方案。 您可以在 XAML 的 Tag 属性中设置绑定(这是后备属性),然后从此属性中检索值。

ElementName 类型绑定示例:

    <TabControl x:Name="tab" ItemsSource="{Binding TabItemList}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="TabItem">
                <Setter Property="AllowDrop" Value="True" />
                <EventSetter Event="PreviewMouseMove" Handler="TabItemPreviewMouseMove" />
                <EventSetter Event="Drop" Handler="TabItemDrop" />
                <Setter Property="Tag" Value="{Binding ElementName=tab}"/>
            </Style>
        </TabControl.ItemContainerStyle>

FindAncestor 类型绑定示例:

    <TabControl ItemsSource="{Binding TabItemList}">
        <TabControl.ItemContainerStyle>
            <Style TargetType="TabItem">
                <Setter Property="AllowDrop" Value="True" />
                <EventSetter Event="PreviewMouseMove" Handler="TabItemPreviewMouseMove" />
                <EventSetter Event="Drop" Handler="TabItemDrop" />
                <Setter Property="Tag"
                        Value="{Binding RelativeSource={RelativeSource FindAncestor,AncestorType={x:Type TabControl}}}"/>
            </Style>
        </TabControl.ItemContainerStyle>

检索值:

    private void TabItemDrop(object sender,DragEventArgs e)
    {
        TabItem tabItem = e.Source as TabItem;
        TabControl tab = tabItem.Tag as TabControl;
        if (tab != null)
        {
            //Expect to get the tabControl here
        }
    }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。