[WPF, MVVM] Проблема с LostFocus
От: Аноним  
Дата: 27.02.11 12:04
Оценка:
фыв
Re: [WPF, MVVM] Проблема с LostFocus
От: Аноним  
Дата: 27.02.11 12:09
Оценка:
Есть MainView с фреймом и основными кнопками типа "Save". Во фрейм встраивается LocalView.
На этом LocalView контролы TextBox. Text этих TextBox'ов биндится на Properties во ViewModel. Binding срабатывает по OnLostFocus.
Проблема в том, что если после редактирования TextBox (на LocalView) сразу нажать на "Save" (на MainView) событие LostFocus не вызывается!!
Следовательно измененеие последнего TextBox не сохраняется.
Как можно решить эту проблему?

P.S. сорри за оффтоп в первом message.

Спасибо.
Re[2]: [WPF, MVVM] Проблема с LostFocus
От: tofox  
Дата: 27.02.11 12:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть 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 click
private 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?
Re[2]: [WPF, MVVM] Проблема с LostFocus
От: Codechanger Россия  
Дата: 27.02.11 14:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть 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 именно после окончания ввода.
Re[4]: [WPF, MVVM] Проблема с LostFocus
От: Codechanger Россия  
Дата: 27.02.11 17:21
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Codechanger, Вы писали:


C>>Уммм... завязываться на событие смены фокуса в TextBox — событие неблагодарное. Лучше в биндинге поставьте UpdateSourceTrigger=PropertyChanged. Тогда у вас будет изменение значения по изменению значения в текстбоксе

А>Раньше так и работало. И работало прекрасно.
А>Но появилась необходимость обновлять property именно после окончания ввода.

Работайте не с объектом, а с его копией. Делов-то.
Re[2]: [WPF, MVVM] Проблема с LostFocus
От: notacat  
Дата: 27.02.11 17:41
Оценка:
попробуйте в LocalView на какое-нибудь событие типа Unloaded принудительно байндинги обновлять
Re[2]: [WPF, MVVM] Проблема с LostFocus
От: HowardLovekraft  
Дата: 28.02.11 07:25
Оценка: 1 (1)
Здравствуйте, Аноним, Вы писали:

А>Как можно решить эту проблему?

1. Сделать attached-свойство типа ICommand;
2. Присоединить это свойство к кнопке:
behaviors:MyBehavior.Command="{Binding SaveCommand}"

3. В коллбэке, срабатывающем на изменение attached-свойства, выполнить подписку на событие Click кнопки.
4. В обработчике события просмотреть визуальное дерево (корень выберете по необходимости), выбрать нужные элементы (по типу или еще каким-то признакам), у них взять интересующие dependency/attached-свойства, и вызвать UpdateSource() для binding expressions этих свойств.
5. После принудительного обновления bindings проверить, можно ли выполнить команду, если да, и выполнить ее.

Тут же можно завязаться на валидацию данных (т.е. если какое-то из binding expressions не прошло валидацию, до выполнения команды не доходить).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.