WPF - Отмена выбора вкладки в TabControl вызывает проблемы

1

У меня есть приложение с некоторым TabControl, и на определенной вкладке можно запустить длинное вычисление. Я хочу, чтобы пользователь подтвердил выход из вкладки и прервал вычисление. До сих пор я создал Поведение и привязал его к tabcontrol. (код в конце). Моя проблема: предположим, что я хочу оставить вкладку №3. Я выбираю вкладку №2 → диалоговое окно подтверждения и я выбираю no (CanNavigateFromMe() == false), и я возвращаюсь к вкладке № 3. Опять же, я выбираю tab # 2 и получаю такое же поведение. Я хочу выбрать его в третий раз - теперь нажатие на заголовок не запускает событие CurrentChanging!

код для поведения:

    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.Loaded += new System.Windows.RoutedEventHandler(AssociatedObject_Loaded);
    }

    void AssociatedObject_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        // required in order to get CurrentItemChanging
        AssociatedObject.IsSynchronizedWithCurrentItem = true;

        AssociatedObject.Items.CurrentChanging += new CurrentChangingEventHandler(Items_CurrentChanging);
    }



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

        var view = item as FrameworkElement;
        if (view == null)
        {
            return;
        }
        IAllowNavigation allowNavigation = view.DataContext as IAllowNavigation;
        if ((allowNavigation != null) &&
            (allowNavigation.CanNavigateFromMe() == false))
        {
            e.Cancel = true;
            AssociatedObject.SelectedItem = view;
        }
    }
Теги:
wpf
selection
tabs
tabcontrol

1 ответ

0

После некоторой помощи друзей я узнал, что мне нужно: 1. вызвать Refresh() в коллекции, если отменить выбор. 2. убедитесь, что исходный выбор сделан, если я решил разрешить выбор (это включает в себя ввод пользователя и занимает время, между тем ecents внутри других вкладок могут изменить выбранный элемент)

    void Items_CurrentChanging(object sender, CurrentChangingEventArgs e)
    {
        var newItem = AssociatedObject.SelectedItem;
        var item = ((ICollectionView)sender).CurrentItem;


        var view = item as FrameworkElement;
        if (view == null)
        {
            return;
        }
        IAllowNavigation allowNavigation = view.DataContext as IAllowNavigation;
        if ((allowNavigation != null) &&
            (allowNavigation.CanNavigateFromMe() == false))
        {
            e.Cancel = true;
            AssociatedObject.SelectedItem = view;

        }
        else
        {
            AssociatedObject.SelectedItem = newItem;
        }

        ((ICollectionView)sender).Refresh();

    }
  • 0
    Как вы указали, важно сохранить выбранный элемент в начале метода, потому что он каким-то образом возвращается к своему предыдущему значению к тому времени, когда вы получите инструкцию else.
  • 0
    Я сталкиваюсь с той же проблемой, когда если вы попытаетесь дважды перейти и отменить, это не сработает в третий раз. Вызов обновления не решает проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню