我非常感謝Thomas Levesque和lukas的回答。他們包含了一些有用的見解和例子。我發佈這個答案是因爲我想提供更多信息和示例解決方案。與許多計算/用戶界面問題一樣,常常必須作出妥協。我發現了一個不幸的發現,那就是當改變區域+語言設置時,InputScopeNameValues(MSDN InputScopeNameValue Enumeration)在十進制(。)和逗號(,)之間切換(並且,我仔細檢查了手機上的鍵盤設置爲僅使用德語)。
然而,由於這些文本框輸入的數值,需要迅速進入,數字InputScopes仍然以最好的一段路要走。有趣的是,即使用戶被迫使用小數點代替逗號,只要輸入到文本框中,字符串格式就會改變,例如,即使如「{0:#。000}」所示,從「.123」到「,123」也是如此。因此,妥協和在下面的代碼中,解決方法(到目前爲止在en-US和de-DE中進行了測試)。
注意:正如lukas提到的那樣,驗證用戶輸入總是明智的。我沒有在這裏使用TryParse(儘管我可能),所以我不必重寫很多代碼。這是在UI通過選擇一個數字InputScope並通過try/catch塊的處理代碼,甚至正確處理減輕用戶試圖通過從剪貼板粘貼文本,以繞過數字輸入:
<TextBox x:Name="myTBox" InputScope="Number" Text="{Binding SomeNumber, Mode=TwoWay}" />
和代碼:
public string SomeNumber
{ 得到 { 回報的String.Format( 「{0:#000}」,SomeProfileModel.Instance.SomeProfile.SomeNumber); }
set
{
if (SomeProfileModel.Instance.SomeProfile.SomeNumber.ToString() == value) return;
var oldValue = SomeProfileModel.Instance.SomeProfile.SomeNumber;
try
{
double newValue;
try
{
newValue = Convert.ToDouble(value, CultureInfo.CurrentCulture);
}
catch (Exception)
{
newValue = Convert.ToDouble(value, CultureInfo.InvariantCulture);
}
if (Convert.ToDouble(MyAppParams.SomeNumberMin, CultureInfo.InvariantCulture) > newValue || Convert.ToDouble(MyAppParams.SomeNumberMax, CultureInfo.InvariantCulture) < newValue)
{
// Revert back to previous value
// NOTE: This has to be done here. If done in the catch statement,
// it will never run since the MessageBox interferes with it.
throw new Exception();
}
SomeProfileModel.Instance.SomeProfile.SomeNumber = newValue;
RaisePropertyChanged("SomeNumber", oldValue, newValue, true);
}
catch (Exception err)
{
System.Windows.MessageBox.Show("Value must be a number between " + MyAppParams.SomeNumberMin + " and " + MyAppParams.SomeNumberMax);
}
}
}