繁体   English   中英

引用 itemsource 时,在 tabcontrol 上使用 tabindex 的样式触发器不起作用

[英]Style Trigger using tabindex on tabcontrol is not working when itemsource is referenced

我有 tabcontrol,它使用可观察的 tabitems 集合作为 itemsource。 我不想要单独的第一个选项卡的关闭按钮。 所以我添加了样式触发器

<Style TargetType="{x:Type TabItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type TabItem}">
<Grid Background="White">
<Border Name="Border" BorderBrush="#1b9ed2" Margin="6,0,12,0" Background="White">
<ContentPresenter Height="30" x:Name="ContentSite" ContentSource="Header" VerticalAlignment="Bottom" HorizontalAlignment="Center" Margin="5,15,5,-5">
</ContentPresenter>
</Border>
<Button  Background="Transparent" BorderBrush="Transparent" Name="TabCloseButton" Click="TabCloseButton_Click" HorizontalAlignment="Right" VerticalAlignment="Bottom" ToolTip="Close" HorizontalContentAlignment="Right" Padding="0">
<materialDesign:PackIcon Kind="Close" Foreground="Gray" HorizontalAlignment="Right"/>
</Button>
</Grid>
<ControlTemplate.Triggers>
<Trigger Property="TabIndex" Value="0">
<Setter TargetName="TabCloseButton" Property="Visibility" Value="Collapsed"/>
</Trigger>
......
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="FontSize" Value="12"/>
</Style>
</TabControl.Resources>

如果我只是在 xaml 中添加项目,它就可以工作

<TabControl Name ="ConnectionsTab">
<TabItem Header="...." TabIndex="0"></TabItem>
<TabItem Header="...." TabIndex="1"></TabItem>
</TabControl>

但是当我将 itemsource 设置为 tabcontrol 时它不起作用

private ObservableCollection<TabItem> tabItems = new ObservableCollection<TabItem>();

内部构造函数

tabItems.Add(new TabItem { Header = "Connections", Content = new ResourceAccountDisplayUserControl(response), TabIndex = 0 });
ConnectionsTab.ItemsSource = tabItems;

我不知道为什么它不起作用。 使其工作的任何想法或代码都会有所帮助。

首先,如果TabControl内的TabItem ,则TabIndex不是索引。 因此,您需要一种不同的方法来确定实际的标签 position。

如果您的数据源实现IList ,例如,您可以编写一个MultiValueConverter来确定集合中项目的 position:

public class MyTabItemIndexConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        // TODO: add some validation to avoid unsupported values
        var c = (IList)values[1];
        return c.IndexOf(values[0]);
    }

    public object[] ConvertBack(object values, Type[] targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

旁注:可能还有其他方法可以确定索引,例如Determining index of a tabitem

然后你可以使用这个转换器,将实际的项目索引存储在某个地方(或直接使用它)。 在此示例中,我将TabItem.Tag属性设置为项目索引:

<Window.Resources>
    <local:MyTabItemIndexConverter x:Key="tabItemIndexConverter"/>
</Window.Resources>

[...]
<TabControl Name="tabControl1" ItemsSource="{Binding}">
    <TabControl.ItemContainerStyle>
        <Style TargetType="TabItem">
            <Setter Property="Tag">
                <Setter.Value>
                    <MultiBinding Converter="{StaticResource tabItemIndexConverter}">
                        <Binding />
                        <Binding ElementName="tabControl1" Path="ItemsSource" />
                    </MultiBinding>
                </Setter.Value>
            </Setter>
        </Style>
    </TabControl.ItemContainerStyle>

    [...]

</TabControl>

现在有了TabItem.Tag ,您就有了一个可以实际用于实现触发逻辑的属性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM