У меня есть приложение с некоторым 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;
}
}
После некоторой помощи друзей я узнал, что мне нужно: 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();
}