2014-01-20 6 views
2

У меня есть UserControl, который позволяет пользователю вводить данные. Я пытаюсь обеспечить, чтобы, когда фокус удаляется из пользовательского элемента управления, происходит проверка данных, и пользователь должен вернуться и исправить данные или отменить сделанные изменения.WPF User Control Losing Focus

Я пытался использовать usercontrol LostFocus, но это, кажется, вызывается каждый раз, когда пользователь перемещается между элементами управления внутри UserControl, а не только тогда, когда UserControl теряет фокус. Кроме того, похоже, что нет способа увидеть, куда сосредоточен фокус, и предотвратить потерю фокуса - то есть заставить пользователя вернуться и исправить ситуацию.

Я прихожу из фона Winforms, и этого было бы очень легко достичь, но я не вижу никакого простого способа сделать это в WPF.

Может кто-нибудь помочь?

P.S. Пример кода (который не работает ...)

private void UserControl_LostFocus(object sender, RoutedEventArgs e) 
    { 
     if (IsModified) 
     { 
      e.Handled = true; 
      btnSave_Click(this, e); 
     } 

    } 

Вышеупомянутый вызывается всякий раз, когда элемент управления внутри пользовательского элемента управления потерял фокус. Поэтому, если пользовательский элемент управления говорит, что 3 текстовых поля, когда пользователь перемещается между ними, это событие вызывается каждый раз. Я хочу обработать событие только в том случае, если фокус удаляется из самого пользовательского элемента управления. Затем я хочу пригласить пользователя по строкам «Сохраните или отмените изменения, прежде чем удаляться от этой страницы». И только тогда, когда фокус перемещается в другую часть приложения, а не, например, если пользователь имеет ALT-Tabbed от приложения.

+0

Это * не * что-то, что нам нужно сделать в WPF ... или вообще не так. Пожалуйста, взгляните на свойство '' Binding.UpdateSourceTrigger' '(http://msdn.microsoft.com/en-us/library/system.windows.data.binding.updatesourcetrigger (v = vs.110) .aspx) на MSDN. – Sheridan

+0

Как обычно на этом веб-сайте, вы можете обнаружить, что получите больше ответов, если будете следовать описаниям в [Как задать хороший вопрос?] (Http://stackoverflow.com/help/how-to-ask) страницы [Справочного центра] (http://stackoverflow.com/help). Пожалуйста, добавьте [упрощенный пример вашего кода] (http://stackoverflow.com/help/mcve), который все еще четко демонстрирует вашу проблему. – Sheridan

+0

Спасибо за это, но я уже посмотрел на эту область, и это не подходит для того, что я хочу, и я смущен вашим комментарием «это не то, что нам нужно делать в WPF». То, что я хочу сделать, не является чем-то необычным - данные передаются только после нажатия пользователем «Отправить». Это НЕ проблема. Проблема заключается в том, как запретить пользователю удаляться от элемента управления до тех пор, пока они не совершили или не отменили изменения. Итак, насколько мне известно, это не имеет никакого отношения к привязке данных, а к пользовательскому интерфейсу. –

ответ

-1

Итак, теперь я понимаю, что вы просто хотите, чтобы пользователь оставил представление, прежде чем они либо сохранили, либо отменили текущее действие по редактированию. Для справки в будущем всегда лучше начинать свой вопрос с вашей общей цели ... что-то вроде предложения выше. Затем вы говорите, что вы пробовали ... текст вопроса, который у вас есть. На ваш вопрос был бы дан ответ, если вы это сделали.

Итак, как мы можем достичь этого? Это может быть довольно просто, но это будет зависеть от того, как вы меняете представления. Когда пользователь в моих приложениях меняет вид, он нажимает на Button. То, что Button имеет отношение Command и в свойстве ICommand в модели просмотра, я загружаю соответствующий вид. Теперь, если вы используете Command s или события, когда пользователь хочет изменить представление, это не имеет значения.

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

Если вы выберете, вы также можете установить свойство на этом этапе для отображения сообщения в пользовательском интерфейсе, который пользователь должен сохранить или отменить перед изменением вида. Это можно сделать так же просто, как привязка данных к string, которая начинается с пустого значения до TextBlock в пользовательском интерфейсе и устанавливает его в сообщение, когда пользователь пытается загрузить другое представление.

+0

Спасибо, но это все еще не мешает пользователю перейти на другую страницу. Это просто означает, что записывается тот факт, что они редактируются. –

+0

Как это не так? Я сказал * В этот момент у вас есть контроль в приложении. Вы можете просто не загружать представление, если элемент данных не был сохранен или редактирование не отменено. * ... как не загружает новое представление * не * запрещает пользователю изменять вид или страницу по вашему запросу Это? – Sheridan

Смежные вопросы