Триггер стиля с использованием tabindex на tabcontrol не работает, когда есть ссылка на источник элементов - PullRequest
0 голосов
/ 06 августа 2020

У меня есть tabcontrol, который использует наблюдаемую коллекцию tabitems в качестве источника элементов. Мне не нужна кнопка закрытия только для первой вкладки. Итак, я добавил триггер стиля

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

Но он не работает, когда я делаю источник элементов в tabcontrol

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

внутри конструктора

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

Я не знаю, почему он не работает. Любая идея или код, чтобы заставить его работать, будут полезны.

1 Ответ

0 голосов
/ 06 августа 2020

Прежде всего, TabIndex не является индексом, если ваш TabItem находится внутри TabControl. Итак, вам нужен другой способ определения фактического положения табуляции.

Если ваш источник данных реализует IList, вы могли бы, например, написать MultiValueConverter, который определяет положение элемента в коллекции:

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();
    }
}

Боковое примечание: возможно, есть другие способы определения индекса, например Определение индекса элемента табуляции .

Затем вы можете использовать этот конвертер для сохранения фактического индекс элемента где-нибудь (или используйте его напрямую). В этом примере я установил свойство 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 у вас есть свойство, которое вы можете фактически использовать для реализации своего триггерного logi c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...