WPF: событие LostFocus для определенного элемента управления / view / viewmodel - PullRequest
2 голосов
/ 27 августа 2009

Я работаю в WPF, используя шаблон MVVM, и в целом все, кажется, работает довольно хорошо, поскольку я оборачиваюсь вокруг нюансов как WPF, так и MVVM. Тем не менее, я в настоящее время застрял на конкретном вопросе. Мое настоящее приложение довольно сложное, поэтому для упрощения давайте возьмем почти определенную статью Джоша Смита о шаблоне и используем приложение в нем.

Рассмотрите рисунок 2 и представьте, что пользователь набрал некоторые вещи в полях имени и фамилии. Затем пользователь полностью уходит из рабочей области (viewmodel), либо щелкая другую вкладку клиента, либо, возможно, совершенно другую модель представления в том же приложении. В этом случае я хотел бы, чтобы приложение спросило: «Эй, ты хотел сохранить свои изменения? Да / Нет / Отмена» и ответило соответствующим образом. Это создало ... проблемы.

Поскольку я хотел бы, чтобы пользователь мог «отменить» этот первый проход, он требует PreviewLostKeyboardFocus (поскольку я мог бы установить Handled = true и отменить сдвиг фокуса). Однако некоторые пользовательские действия (например, нажатие на вкладку в другом рабочем пространстве) не смещают фокус клавиатуры. LostFocus лучше подходит для меня в этом отношении, но это только после того, как фокус уже потерян (хотя, конечно, я мог бы переключить его обратно?), И есть проблемы с определением, было ли событие из самого представления (то есть мы уходим весь вид) или если он просто пузырился от какого-то содержащегося объекта.

И большая картина всего этого - это кажется проблемой для представления, но тогда это подразумевает написание кода в представлении, а не волшебную модель представления. Что заставляет меня думать, что я не смотрю на это правильно.

Так что я надеюсь, что мне не хватает какой-то большой концептуальной а-ха, которая прояснит все это. Помощь

1 Ответ

3 голосов
/ 27 августа 2009

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

Итак, вам нужна всеобъемлющая модель представления, обязанности которой:

  • Предоставить коллекцию всех моделей подвидов (каждая из которых отображается на отдельной вкладке)
  • Отслеживание активной (выбранной) модели вспомогательного вида (т. Е. Активной вкладки)

Ваш вид будет привязан к этим свойствам обычным образом:

<TabControl ItemsSource="{Binding Tabs}" SelectedItem="{Binding SelectedTab}"/>

Свойство SelectedTab будет применять вашу логику следующим образом:

  1. Загрязнена ли текущая вкладка?
  2. Если это так, подскажите пользователю через службу
  3. Если пользователь отменяет, не меняйте активную вкладку
  4. Если пользователь сохраняет или отменяет изменения, измените активную вкладку

Я думаю, что ключевой вещью, которую вы упускаете, является всеобъемлющая модель представления. Работа с моим примером проекта ActiveAwareCommand может помочь вам лучше понять.

...