簡體   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