我發現這個link關於類似的問題,除了我的文本框添加扭曲後需要一個格式化的值失去焦點後。WPF MVVM:TextBox需要的格式和按鈕與IsDefault設置爲True
<TextBox Text="{Binding Value}" MaxLength="{Binding MaskLength}"/>
<Button Command="{Binding ExecuteCommand}" IsDefault="True"/>
在用戶在文本框中輸入文本後,我想用用戶定義的掩碼格式化文本。例如,如果掩碼是「00000」,則慣例將是右對齊和零填充。
123 => 0 A01 => 00A01
等等
,我快到的問題是,我應該只格式化文本一次,當用戶有完成打字。目前,如果用戶點擊按鈕,用戶輸入的值被推送到綁定並執行該命令。但是,如果他們按下「Enter」鍵,則該值不會被推送到綁定,並且命令仍然被執行。
我發現如何在用戶按下回車鍵時推送綁定的唯一方法是更改文本框的綁定並指定UpdateSourceTrigger=PropertyChanged
。這不能很好地工作,因爲我實際上並不知道用戶何時完成輸入文本。
最簡單的解決方案是在按下回車鍵時添加代碼隱藏功能以設置按鈕的焦點,但是我希望將焦點留在當前所在的文本框中。有沒有人有辦法解決這個問題,也許是附屬物?
編輯:
這裏是我的視圖模型是如何格式化輸入值的一個簡單的例子。
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();
}
}
}
將其設置爲PropetyChanged不更新源但格式是正確的。假設我想將值'ab1'格式化爲'00AB1'。如果在用戶點擊「a」時設置爲PropertyChanged,則該值將變爲「0000A」。現在用戶點擊'b',並且由於達到了最大長度而被忽略。 – 2010-08-31 15:51:50
沒有它沒有。請參閱我的下一個答案,以查看完全有效的代碼(已測試) – JanW 2010-08-31 16:19:14