UpdateSource на активном поле перед деактивацией окна - PullRequest
1 голос
/ 10 февраля 2012

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

Я не установил UpdateSourceTrigger во всех моих полях в главном окне в PropertyChanged (в любом случае это не нужно во всех случаях из-за функциональности в главном окне).

Но мне нужно главное окно, чтобы сделатьисточник обновления в поле «активный» в случае, если пользователь активирует диалоговое окно дел, чтобы данные могли быть сохранены в базе данных и повторно прочитаны в диалоговом окне дел.

Если были«Деактивировать» событие в окне, я мог бы использовать это, чтобы просто установить фокус на что-то другое (принудительно заставить любой текущий фокусированный элемент управления обновить его источник).Но никакого Деактивирующего события не существует, только Деактивированное, которое происходит после факта.И установка фокуса в деактивированном главном окне портит активацию диалога дел.Кроме того, я не могу сделать это в событии Actived To-Do-диалогов.Активирующее событие помогло бы, но его не существует.

Любые хорошие идеи, как заставить источник обновлений в моем главном окне до , чтобы активировать диалоговое окно дел (либо путем нажатия наэто или щелкнув мышью)?

Ответы [ 2 ]

1 голос
/ 09 ноября 2013

Этот вид отклоняется от ответа @ AkselK, но я обнаружил, что элемент управления, ориентированный на клавиатуру, использует свойство Keyboard.FocusedElement и обновляет правильные привязки в зависимости от того, является ли оно TextBox, Selector или ToggleButton. Я ожидал, что Keyboard.FocusedElement скажет мне, что окно, на которое я переключался, является фокусом, но на самом деле оно дает мне контроль, в котором я находился внутри деактивирующего окна.

void MyWindow_Deactivated(object sender, EventArgs e)
{
    if(Keyboard.FocusedElement is TextBox)
    {
        (Keyboard.FocusedElement as TextBox).GetBindingExpression(TextBox.TextProperty).UpdateSource();
    }
    else if(Keyboard.FocusedElement is Selector)
    {
        (Keyboard.FocusedElement as Selector).GetBindingExpression(Selector.SelectedItemProperty).UpdateSource();
        //todo: should this also update SelectedValueProperty?
    }
    else if(Keyboard.FocusedElement is ToggleButton)
    {
        (Keyboard.FocusedElement as ToggleButton).GetBindingExpression(ToggleButton.IsCheckedProperty).UpdateSource();
    }
}

Я не уверен, что часть Selector должна также обновлять привязку для SelectedValue.

0 голосов
/ 10 февраля 2012

Вам не нужно устанавливать Фокус на другой элемент для обновления привязки. Вместо этого вы можете использовать метод GetBindingExpression:

valueTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();

Это может работать в событии Деактивация.

...