如何解决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 举报,一经查实,本站将立刻删除。