我有一个文本框
<TextBox Text="{Binding TransactionDetails.TransactionAmount, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged}" Grid.Column="3" Grid.ColumnSpan="2" Grid.Row="5"
x:Name="TextBoxAmount"/>
Run Code Online (Sandbox Code Playgroud)
我把"TransactionAmount"作为Double.它在整数值上运行良好,但是当我输入一些浮点值如100.456时,我无法输入'.'
Her*_*erm 14
每次值更改时,您都在更新属性.键入a时.,会将其写入viewmodel并更新视图.
例如,如果你输入100.它是四舍五入的100,那么你将不会看到任何点.
您有一些选项可以更改此行为:
使用延迟绑定:
<TextBox Text="{Binding Path=TransactionDetails.TransactionAmount,
Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,
Delay=250}"
Grid.Column="3"
Grid.ColumnSpan="2"
Grid.Row="5"
x:Name="TextBoxAmount" />
Run Code Online (Sandbox Code Playgroud)
只有在与保存的值不同时才更改值(我建议每个绑定使用此值):
private double _transactionAmount;
public double TransactionAmount
{
get { return _transactionAmount; }
set
{
if (_transactionAmount != value)
{
_transactionAmount = value;
Notify("TransactionAmount");
}
}
Run Code Online (Sandbox Code Playgroud)
或使用某种验证,例如ValidatesOnExceptions.
当您的应用程序面向 .NET 4.0 或更早版本时,该行为符合预期,但后来发生了更改 ( MSDN )。可以通过设置恢复旧的行为:
System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
Run Code Online (Sandbox Code Playgroud)
尽早设置(例如在 App.cs 的构造函数中),否则框架会引发异常。
来源及详细解释:https://web.archive.org/web/20220127083119/https ://www.mobilemotion.eu/?p=1855
StringFormat我通过使用类似得到的最佳解决方案
<TextBox Text="{Binding TransactionDetails.TransactionAmount, Mode=TwoWay,
UpdateSourceTrigger=PropertyChanged,StringFormat=N2}" Grid.Column="3"
Grid.ColumnSpan="2" Grid.Row="5" x:Name="TextBoxAmount" />
Run Code Online (Sandbox Code Playgroud)
我们也可以根据要求采用自定义字符串格式