我有一个选项卡控件,如下所示:
<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;
}
}
一切正常。有谁知道设置索引是否有理由显式显示上述行为?