WPF текстовое поле, которое обновляет привязку только при нажатии Enter - PullRequest
9 голосов
/ 17 сентября 2009

все. У меня есть пользовательский контроль «NumericTextBox», который позволяет только числовые записи. Мне нужно продемонстрировать другое специализированное поведение, то есть мне нужно, чтобы оно могло связывать его со значением виртуальной машины OneWayToSource и обновлять значение виртуальной машины только при нажатии клавиши ввода при фокусировке текстового поля. У меня уже есть событие EnterPressed, которое срабатывает, когда я нажимаю клавишу, мне просто трудно найти способ заставить это действие обновить привязку ...

Ответы [ 3 ]

11 голосов
/ 17 сентября 2009

В своем выражении привязки установите UpdateSourceTrigger на Explicit.

Text="{Binding ..., UpdateSourceTrigger=Explicit}"

Затем, при обработке события EnterPressed, вызовите UpdateSource для выражения привязки, это будет толкать значение из текстового поля к фактической границе.собственность.

BindingExpression exp = textBox.GetBindingExpression(TextBox.TextProperty);
exp.UpdateSource();
7 голосов
/ 25 июля 2012

Вот полная версия идеи, предложенной Андерсоном Имесом:

public static readonly DependencyProperty UpdateSourceOnKeyProperty = 
    DependencyProperty.RegisterAttached("UpdateSourceOnKey", 
    typeof(Key), typeof(TextBox), new FrameworkPropertyMetadata(Key.None));

    public static void SetUpdateSourceOnKey(UIElement element, Key value) {
        element.PreviewKeyUp += TextBoxKeyUp;
        element.SetValue(UpdateSourceOnKeyProperty, value);
    }

    static void TextBoxKeyUp(object sender, KeyEventArgs e) {

        var textBox = sender as TextBox;
        if (textBox == null) return;

        var propertyValue = (Key)textBox.GetValue(UpdateSourceOnKeyProperty);
        if (e.Key != propertyValue) return;

        var bindingExpression = textBox.GetBindingExpression(TextBox.TextProperty);
        if (bindingExpression != null) bindingExpression.UpdateSource();
    }

    public static Key GetUpdateSourceOnKey(UIElement element) {
        return (Key)element.GetValue(UpdateSourceOnKeyProperty);
    }
3 голосов
/ 17 сентября 2009

Если вы используете MVVM, вы можете использовать комбинацию подхода decastelijau вместе с пользовательским вложенным свойством, которое вызывает UpdateSource для текстового поля при PreviewKeyUp.

public static readonly DependencyProperty UpdateSourceOnKey = DependencyProperty.RegisterAttached(
  "UpdateSourceOnKey",
  typeof(Key),
  typeof(TextBox),
  new FrameworkPropertyMetadata(false)
);
public static void SetUpdateSourceOnKey(UIElement element, Key value)
{

  //TODO: wire up specified key down event handler here
  element.SetValue(UpdateSourceOnKey, value);

}
public static Boolean GetUpdateSourceOnKey(UIElement element)
{
  return (Key)element.GetValue(UpdateSourceOnKey);
}

Тогда вы можете сделать:

<TextBox myprops:UpdaterProps.UpdateSourceOnKey="Enter" ... />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...