1

我有一个选项卡控件,如下所示:

<TabControl x:Name="tabControl1"
        Margin="6,42,12,6"
        HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <TabControl.Style>
        <Style TargetType="{x:Type TabControl}">
            <Setter Property="SelectedIndex" Value="0"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=Test.IsStopped}" Value="True">
                    <Setter Property="SelectedIndex" Value="5"/>
                    <Setter Property="Background" Value="Red"/>
                </DataTrigger>
             </Style.Triggers>
         </Style>
    </TabControl.Style>
    <TabItem...>
    <TabItem...>
    ...
</TabControl>

IsStopped 是视图模型上的一个属性(实现 INotifyPropertyChanged 等)。现在,这一切都很好,但有一个问题。我还有一些代码用于增加标签索引的“下一步”和“后退”按钮

private void NextButton_Click(object sender, RoutedEventArgs e)
{
    int old = tabControl1.SelectedIndex;
    try
    {
        tabControl1.SelectedIndex++;
    }
    catch (IndexOutOfRangeException)
    {
        tabControl1.SelectedIndex = old;
    }
}

如果在任何时候调用此代码,DataTrigger 将不再更新 SelectedIndex。背景仍然变为红色(只是为了测试绑定)。我了解依赖属性值优先级,但这很烦人,因为我似乎无法控制正在发生的事情。到底发生了什么?作为一个额外的问题,我知道 WPF 中的一些调试技巧,但我怎么可能开始明白为什么这不起作用?

编辑 10/8/2013 2:45 EST

好吧,这很有趣...我已将 NextButton_Click 事件更改为以下内容,以模拟单击选项卡时发生的情况:

private void NextButton_Click(object sender, RoutedEventArgs e)
{
    int old = tabControl1.SelectedIndex;
    try
    {
        TabItem nextItem = ((TabItem)tabControl1.Items[old + 1]);
        nextItem.IsSelected = true;
    }
    catch (IndexOutOfRangeException)
    {
        tabControl1.SelectedIndex = old;
    }
}

一切正常。有谁知道设置索引是否有理由显式显示上述行为?

4

1 回答 1

1

出于调试目的,我将一个处理程序连接到 SelectionChanged 事件,并开始查看它由触发器触发与由 try-catch 触发时可能有什么不同。另外 x:Name 您的 DataTrigger 绑定,并在运行时在后面的代码中查看它,并确保该绑定始终与您期望的相同(我的第一个怀疑是这里可能会发生变化)。

于 2013-10-08T16:32:01.473 回答