Я нашел эту ссылку о подобной проблеме, за исключением того, что у меня добавлен поворот текстового поля, требующего форматированного значения после потери фокуса.
<TextBox Text="{Binding Value}" MaxLength="{Binding MaskLength}"/>
<Button Command="{Binding ExecuteCommand}" IsDefault="True"/>
После того, как пользователь вводит текст в текстовое поле, я хотел бы отформатировать его с помощью пользовательской маски. Например, если маска «00000», соглашение будет соответствовать выравниванию по правому краю и заполнению нулями.
123 => 00123
A01 => 00A01
и т.д ...
Проблема, с которой я сталкиваюсь, заключается в том, что я должен форматировать текст только один раз, когда пользователь закончит печатать. В настоящее время, если пользователь нажимает кнопку, введенное пользователем значение помещается в привязку, и команда выполняется. Однако, если они нажимают клавишу «Ввод», значение не передается в привязку, и команда все еще выполняется.
Единственный способ узнать, как нажать привязку, когда пользователь нажимает клавишу ввода, - это изменить привязку текстового поля и указать UpdateSourceTrigger=PropertyChanged
. Это не очень хорошо работает, потому что я не знаю, когда пользователь закончил вводить свой текст.
Самым простым решением было бы добавить код позади, чтобы установить фокус кнопки при нажатии клавиши ввода, однако я бы хотел, чтобы фокус оставался в текстовом поле, в котором они находятся в данный момент. У кого-нибудь есть способ обойти это, может быть, прикрепленное свойство?
EDIT:
Вот краткий пример того, как моя модель представления форматирует введенное значение.
public string Value
{
get
{
return mFieldValue;
}
set
{
SetValueAndRaisePropertyChange(
ref mFieldValue,
_ApplyFormat( value ),
() => FieldValue );
}
}
Вот самый чистый код, который я нашел после взлома. Я превратил это в прикрепленную собственность, но она все еще не совсем пахнет.
private void _HandleTxtKeyDown( object sender, KeyEventArgs e )
{
if( e.Key == Key.Enter )
{
TextBox textBox = (TextBox)sender;
BindingExpression binding = textBox.GetBindingExpression( TextBox.TextProperty );
if( binding != null )
{
binding.UpdateSource();
}
}
}