Я бы рассмотрел редизайн этого окна вместо введения кучи новых проблем, просто путем проб и ошибок в свойстве привязки IsAsync.
Я не уверен, разрешит ли элемент управления с вкладками этот уровень управления, который вы ищете. Вы можете попытаться поймать событие, когда кто-то попытается изменить выбранный элемент, но вы не сможете отменить его. Однако есть способ, см. Вариант 4, если вы не хотите читать другие предложения.
Вариант 1: пользовательский элемент управления
Я хотел бы написать немного пользовательского кода, который имитирует функциональность контейнера элемента. Так легко добиться желаемого поведения. Просто привяжите команду к кнопкам (или к любому другому элементу управления, на котором вы хотите, чтобы пользователь нажал) и верните CanExecute со значением false, если все еще есть изменения, которые нужно отправить - или спросите своего пользователя, что вы хотите, когда он получит выполняется и изменяет только отображаемое содержимое (т. е. пользовательский «TabItem»), если необходимо.
Вариант 2: предотвращение пользователя путем отключения вкладок
Другим способом было бы связать свойство «IsEnabled» каждой из вкладок со свойством зависимости в вашей модели представления, которое определяет, какая из них доступна пользователю. Мол, вы знаете, что первая страница все еще нуждается в работе, просто отключите все остальные. Но имейте в виду, что сейчас вы не создаете никаких TabItems - ваш контент представляет собой просто строки.
public List<TabItem> ItemsSource { get; private set; }
....
ItemsSource = new List<TabItem> { new TabItem() { Header = "Foo", Content = "Foo" }, new TabItem() { Header = "Bar", Content = "Bar" }, new TabItem() { Header = "FooBar", Content = "FooBar" } };
Поскольку вы не хотите, чтобы пользователь что-то делал, а хотели бы попросить сохранить изменения, я бы выбрал собственный маршрут управления. Еще есть вариант 3.
Вариант 3: всплывающее окно
Используйте всплывающее окно и попросите сохранить изменения, если пользователь закончил с изменением того, что находится на этой странице, и нажмет кнопку «Закрыть» (вместо кнопки «Сохранить», которая также должна находиться на той же странице;) )
Вариант 4: проверка на StackOverflow
На самом деле я сделал это для вас, и вот решение, которое другой пользователь нашел для той же самой проблемы: Управление вкладками WPF Предотвращение изменения вкладок
Причина, по которой я не опубликовал это заранее, состояла в том, что я лично не сделал бы это таким образом, потому что, человек, я ненавижу приложения, которые делают это.
Вот, пожалуйста.