首页 > 解决方案 > 当另一个选项卡禁用时,如何使用 XAML 触发器更改 TabControl 索引?

问题描述

我所拥有的是一个带有两个选项卡的 WPF 应用程序中的 TabControl。有一个名为 的集合Voices,您可以在第 6 行看到它Path=GameMaster.Voices.Count。我想要实现的是,当集合为空时,第二个选项卡禁用,我已经成功完成。然后,我希望将 TabControl 的 SelectedIndex 设置为 0。这不仅会禁用第二个选项卡,还会强制用户返回第一个选项卡。使用下面的代码,结果有点起作用,但是,当我将第一个项目添加到集合中时,选项卡索引似乎设置为 -1。

这是应用程序启动时 TabControl 的屏幕截图,此时集合中没有对象:

初始视图

但是,在添加项目时,会发生以下情况:

添加项目后查看

这是我的 XAML 代码:

<TabControl Grid.Row="2" Margin="0,3,0,0">
    <TabControl.Resources>
        <Style TargetType="TabControl">
            <Style.Triggers>
                <DataTrigger
                    Binding="{Binding Path=GameMaster.Voices.Count, Converter={StaticResource CountGreaterThanZeroConverter}}"
                    Value="False">
                    <Setter Property="SelectedIndex" Value="0" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TabControl.Resources>

    <TabItem Header="Add new voice">

        <!-- TAB 1 CODE -->

    </TabItem>

    <TabItem Header="Edit Voices"
             Name="EditTab"
             IsEnabled="{Binding Path=GameMaster.Voices.Count, Converter={StaticResource CountGreaterThanZeroConverter}}">

        <!-- TAB 2 CODE -->

    </TabItem>
</TabControl>

这是我正在使用的转换器:

internal class CountGreaterThanZeroConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var count = System.Convert.ToInt32(value);

        return count > 0;
    }

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

我试图了解发生了什么,但是我还没有找到合适的解决方案,非常感谢任何帮助。谢谢你。

标签: c#wpfdata-bindingsetterdatatrigger

解决方案


然而,在这里回答,我不是 100% 知道为什么这解决了我的问题。所以,如果有人能让我知道到底发生了什么,那对我来说将是一笔巨大的财富!

我添加了以下代码行:

<TabControl Grid.Row="2" Margin="0,3,0,0">
    <TabControl.Resources>
        <Style TargetType="{x:Type TabControl}">
            <Setter Property="SelectedIndex" Value="0"/>    <!-- This line -->
            <Style.Triggers>
                <DataTrigger
                    Binding="{Binding Path=GameMaster.Voices.Count, Mode=OneWay, Converter={StaticResource CountGreaterThanZeroConverter}}"
                    Value="False">
                    <Setter Property="SelectedIndex" Value="0" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TabControl.Resources>

        ...

</TabControl>

推荐阅读