2010-11-16 4 views
5

К сожалению, нет события TabControl.SelectionChanging (Selector.SelectionChanging), я изо всех сил пытаюсь реализовать это поведение, чтобы отменить изменяющийся запрос.Есть ли способ отменить TabControl.Items.CurrentChanging?

Я пытался справиться с TabControl.Items.CurrentChanging (Items свойства и ItemCollection) событием настройки e.Cancel (от CurrentChangingEventArgs) истинно, но пользовательский интерфейс обновляются с новой вкладкой хотя элемент не изменился в коллекции ,

Есть ли способ предотвратить переход пользователя на другой TabItem, когда состояние неудовлетворено?

ответ

5

Я не знаю точно, почему это происходит, и это сильно меня раздражает.

Но вот мой обходной путь для этого:

В приведенном ниже примере, опция «замок» на текущую вкладку. Таким образом, проверка означает, что пользователь не может изменить вкладку.

void Items_CurrentChanging(object sender, CurrentChangingEventArgs e) 
{ 
    if (checkBox1.IsChecked.Value) 
    { 
     var item = ((ICollectionView)sender).CurrentItem; 

     e.Cancel = true; 

     tabControl1.SelectedItem = item; 
    } 
} 

В основном, что происходит (если я это правильно понимаю), визуальное дерево обновляется, но логическое дерево этого не делает. Вышеупомянутый способ заставляет визуал синхронизироваться с логическим деревом.

+0

Хороший улов. Спасибо. – Shimmy

0

Вы также можете обрабатывать PreviewLostKeyboardFocus событие на каждом TabItem и установите Handled свойство аргументов события в true для предотвращения перехода на другую вкладку:

protected void tabItem_PreviewLostKeyboardFocus(object sender, 
    KeyboardFocusChangedEventArgs e) 
{ 
    if (!ValidateTabItem((TabItem) sender)) { 
     e.Handled = true; 
    } 
} 

См http://www.netframeworkdev.com/windows-presentation-foundation-wpf/how-to-cancel-navigation-between-tabitems-in-a-tabcontrol-84994.shtml.