WPF:Textbox和Binding to Double无法输入.在上面

Sab*_*hra 10 wpf mvvm

我有一个文本框

<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.


Jon*_*rty 6

当您的应用程序面向 .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


Sab*_*hra 5

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)

我们也可以根据要求采用自定义字符串格式