Есть ли способ отменить TabControl.Items.CurrentChanging? - PullRequest
5 голосов
/ 16 ноября 2010

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

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

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

Ответы [ 2 ]

5 голосов
/ 16 ноября 2010

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

Но вот мой обходной путь:

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

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

        e.Cancel = true;

        tabControl1.SelectedItem = item;
    }
}

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

0 голосов
/ 16 ноября 2010

Вы также можете обработать событие PreviewLostKeyboardFocus для каждого TabItem и установить свойство Обработано аргументов события на 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.

...