我想知道是否有更好的更简单的方法重写下面的代码找到最接近的父项,它是一个TabItem并从TabControl中删除它。
我有一个TabControl,我在其中动态添加新的TabItems。我为每个标签指定HeaderTemplate
,看起来像这样;
<DataTemplate x:Key="AttorneyTabHeader">
<StackPanel Orientation="Horizontal">
<TextBlock Text="THE title" Margin="2,0,0,0" FontSize="16" VerticalAlignment="Center" />
<Button Width="Auto" UseLayoutRounding="False" BorderBrush="Transparent" Background="Transparent" Click="CloseAttorneysTabButtonClick">
<Image Source="/images/close-cross-thin-circular-button/close-cross-thin-circular-button16.png" Height="16"></Image>
</Button>
</StackPanel>
</DataTemplate>
标题有一个关闭按钮,我想在点击按钮时关闭TabItem。我的点击处理程序看起来像这样;
public void CloseAttorneysTabButtonClick(object sender, RoutedEventArgs e)
{
TabItem this_tab = (TabItem)((Button)sender).Parent.GetParentObject().GetParentObject().GetParentObject().GetParentObject().GetParentObject().GetParentObject();
AttorneysTabControl.Items.Remove(this_tab);
}
我想知道是否有更好的方法来重写这个,因为现在我依赖于让父母一遍又一遍地假设我改变按钮并忘记更改处理程序。
答案 0 :(得分:0)
可能有几种方法可以处理它,但最简单的方法可能是绑定到TabItem
的{{1}}属性中的Tag
,以便您可以在事件处理程序中使用它。
Button
现在您的事件处理程序可以相对简单,并且不需要像您的示例那样了解它。
<DataTemplate x:Key="TabHeaderTemplate">
<StackPanel Orientation="Horizontal">
<TextBlock Text="The Title" Margin="2 0 0 0" FontSize="16" VerticalAlignment="Center" />
<Button Width="Auto" UseLayoutRounding="False"
BorderBrush="Transparent" Background="Transparent"
Tag="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type TabItem}}, Mode=OneWay}"
Click="Button_Click">
<Image Source="images/close.png" Height="16" />
</Button>
</StackPanel>
</DataTemplate>