Команда кнопки WPF по умолчанию не вызывает привязку в текстовом поле - PullRequest
3 голосов
/ 16 июля 2011

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

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

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

Ответы [ 3 ]

4 голосов
/ 16 июля 2011

Один из способов сделать это с помощью BindingGroup.

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.bindinggroup.aspx

Если ваши TextBox (ы) и Button оба содержатся в Grid (например), вы должны добавитьa BindingGroup, как это:

<Grid>
    <Grid.BindingGroup>
        <BindingGroup Name="bindingGroup1"/>
    </Grid.BindingGroup>

Затем вы можете добавить обработчик события Click к вашей кнопке и вызвать CommitEdit () для BindingGroup (которую Button и TextBox наследуют от Grid):

private void button1_Click(object sender, RoutedEventArgs e)
{
    (sender as FrameworkElement).BindingGroup.CommitEdit();
}

Событие Button.Click вызывается перед CommandBinding, поэтому любые элементы управления TextBox с привязкой к данным или любые другие элементы управления с привязкой к данным внутри этой BindingGroup должны быть обновлены до выполнения команды модели представления.

1 голос
/ 31 октября 2013

Более простой подход (вместо использования группы привязок) состоит в том, чтобы использовать событие нажатия кнопки по умолчанию, чтобы установить фокус на себя. Поскольку это происходит перед выполнением команды, это означает, что ViewModel обновляется во времени.

private void button1_Click(object sender, RoutedEventArgs e)
{
    (sender as Button).Focus()
}

И если вы действительно ненавидите код, вы всегда можете написать прикрепленное свойство ...

1 голос
/ 17 июля 2011

У меня был точный сценарий, который вы только что упомянули. Уловка, которую я использую - это прикрепленное поведение, которое сидит на элементе управления и прослушивает событие PreviewKeyDown. Он проверяет, нажата ли кнопка ввода. Если это так, это заставляет элемент управления потерять фокус, вызывая срабатывание привязки до выполнения команды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...