Есть MainView с фреймом и основными кнопками типа "Save". Во фрейм встраивается LocalView.
На этом LocalView контролы TextBox. Text этих TextBox'ов биндится на Properties во ViewModel. Binding срабатывает по OnLostFocus.
Проблема в том, что если после редактирования TextBox (на LocalView) сразу нажать на "Save" (на MainView) событие LostFocus не вызывается!!
Следовательно измененеие последнего TextBox не сохраняется.
Как можно решить эту проблему?
Здравствуйте, Аноним, Вы писали:
А>Есть MainView с фреймом и основными кнопками типа "Save". Во фрейм встраивается LocalView. А>На этом LocalView контролы TextBox. Text этих TextBox'ов биндится на Properties во ViewModel. Binding срабатывает по OnLostFocus. А>Проблема в том, что если после редактирования TextBox (на LocalView) сразу нажать на "Save" (на MainView) событие LostFocus не вызывается!! А>Следовательно измененеие последнего TextBox не сохраняется. А>Как можно решить эту проблему?
А>P.S. сорри за оффтоп в первом message.
А>Спасибо.
была похожая проблема — я хотел чтоб TextBox терял фокус при клике по форме
сделал хак — при клике по формы передавал фокус невидимому текстбоксу
может чем поможет...
//this is made to force textboxes to lose focus on window clickprivate void MainWindowClick(object sender, MouseButtonEventArgs e)
{
IInputElement focused = FocusManager.GetFocusedElement(this);
if (focused is TextBox)
{
UnfocusTxt.Visibility = Visibility.Visible;
UnfocusTxt.Focus();
UnfocusTxt.Visibility = Visibility.Collapsed;
}
}
Re[3]: [WPF, MVVM] Проблема с LostFocus
От:
Аноним
Дата:
27.02.11 13:04
Оценка:
Здравствуйте, tofox, Вы писали:
T>была похожая проблема — я хотел чтоб TextBox терял фокус при клике по форме T>сделал хак — при клике по формы передавал фокус невидимому текстбоксу T>может чем поможет...
T>
T>//this is made to force textboxes to lose focus on window click
T>private void MainWindowClick(object sender, MouseButtonEventArgs e)
T>{
T>IInputElement focused = FocusManager.GetFocusedElement(this);
T>if (focused is TextBox)
T>{
T> UnfocusTxt.Visibility = Visibility.Visible;
T> UnfocusTxt.Focus();
T> UnfocusTxt.Visibility = Visibility.Collapsed;
T>}
T>}
T>
наверное ваш подход не сработает. Т.к. я использую MVVM ??
кнопка "Save" на MainView биндится на команду в MainViewModel.
MainViewModel в свою очередь знает о LocalViewModel и может вызвать какие-то ее public методы или обратится к ее полям.
Как я могу из LocalViewModel вызвать команду или установить какое-то property, изменение которого приведет к LostFocus у TextBox на LocalView?
Здравствуйте, Аноним, Вы писали:
А>Есть MainView с фреймом и основными кнопками типа "Save". Во фрейм встраивается LocalView. А>На этом LocalView контролы TextBox. Text этих TextBox'ов биндится на Properties во ViewModel. Binding срабатывает по OnLostFocus. А>Проблема в том, что если после редактирования TextBox (на LocalView) сразу нажать на "Save" (на MainView) событие LostFocus не вызывается!! А>Следовательно измененеие последнего TextBox не сохраняется. А>Как можно решить эту проблему?
А>P.S. сорри за оффтоп в первом message.
А>Спасибо.
Уммм... завязываться на событие смены фокуса в TextBox — событие неблагодарное. Лучше в биндинге поставьте UpdateSourceTrigger=PropertyChanged. Тогда у вас будет изменение значения по изменению значения в текстбоксе
Re[3]: [WPF, MVVM] Проблема с LostFocus
От:
Аноним
Дата:
27.02.11 15:36
Оценка:
Здравствуйте, Codechanger, Вы писали:
C>Уммм... завязываться на событие смены фокуса в TextBox — событие неблагодарное. Лучше в биндинге поставьте UpdateSourceTrigger=PropertyChanged. Тогда у вас будет изменение значения по изменению значения в текстбоксе
Раньше так и работало. И работало прекрасно.
Но появилась необходимость обновлять property именно после окончания ввода.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Codechanger, Вы писали:
C>>Уммм... завязываться на событие смены фокуса в TextBox — событие неблагодарное. Лучше в биндинге поставьте UpdateSourceTrigger=PropertyChanged. Тогда у вас будет изменение значения по изменению значения в текстбоксе А>Раньше так и работало. И работало прекрасно. А>Но появилась необходимость обновлять property именно после окончания ввода.
Работайте не с объектом, а с его копией. Делов-то.
3. В коллбэке, срабатывающем на изменение attached-свойства, выполнить подписку на событие Click кнопки.
4. В обработчике события просмотреть визуальное дерево (корень выберете по необходимости), выбрать нужные элементы (по типу или еще каким-то признакам), у них взять интересующие dependency/attached-свойства, и вызвать UpdateSource() для binding expressions этих свойств.
5. После принудительного обновления bindings проверить, можно ли выполнить команду, если да, и выполнить ее.
Тут же можно завязаться на валидацию данных (т.е. если какое-то из binding expressions не прошло валидацию, до выполнения команды не доходить).