2013-10-08 1 views
1

У меня есть элемент управления вкладки, которая выглядит следующим образом:SelectedIndex из обыкновение изменения TabControl в DataTrigger

<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 это свойство на ViewModel (реализует INotifyPropertyChanged и т.д.) Теперь, это все работает отлично, но есть улов. У меня также есть некоторый код, за такие вещи, как «Next» и «Назад» кнопки, увеличиваем индекс Язычок

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

Если этот код не вызывается в любой момент, DataTrigger больше не обновляет SelectedIndex. Фон по-прежнему меняется на красный (только там, чтобы проверить привязку). Я понимаю приоритет ценности свойства зависимостей, но это раздражает, поскольку я, похоже, не контролирую происходящее. Что именно продолжается? В качестве бонусного вопроса я знаю некоторые отладочные трюки в WPF, но как я мог узнать, почему это не работает?

EDIT 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; 
    } 
} 

и все работает нормально. Кто-нибудь знает, есть ли причина, почему установка индекса явно показывает вышеупомянутое поведение?

ответ

1

Ну, для целей отладки я подключил обработчик к событию SelectionChanged и начал смотреть на то, что может отличаться от того, когда он запускается вашим триггером по сравнению с вашим try-catch. Кроме того, x: Назовите привязку DataTrigger и посмотрите на нее в коде, стоящем во время выполнения, и убедитесь, что эта привязка такая же, как вы ожидаете, что она будет всегда (мое первое подозрение было в том, что что-то здесь может меняться).

+1

Благодарим вас за советы. Я не заметил ничего другого между двумя событиями SelectionChanged, хотя я не удивился бы, если бы пропустил что-то. Похоже, что DataTrigger был в порядке. Побеспокоившись в SelectionChanged, я подумал, и я отредактирую свой пост с некоторой дополнительной информацией всего за секунду. – plast1k