【问题标题】:Bind textbox to float value. Unable to input dot / comma将文本框绑定到浮点值。无法输入点/逗号
【发布时间】:2013-01-30 09:44:58
【问题描述】:

当我尝试在文本框中输入点或逗号时,例如1.0283,33,文本框会阻止我输入这样的值(并且输入变为红色)。文本框绑定到一个浮点属性。为什么?

我已将文本框绑定到实现 INotifyPropertyChanged 的类的浮动属性 Power

private float _power;

public float Power
{
    get { return _power; }
    set
    {
        _power = value;
        OnPropertyChanged("Power");
    }
}

在 Xaml 中

<TextBox Name="txtPower" Height="23" TextWrapping="Wrap" Text="{Binding Path=Power, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></TextBox>

我现在根本没有自定义验证。

也尝试了十进制,但它也不起作用。对于字符串,一切正常。

【问题讨论】:

    标签: c# .net wpf


    【解决方案1】:

    如果您有 .NET 4.5 或更高版本,您可以强制执行 4.5 之前的行为

    System.Windows.FrameworkCompatibilityPreferences.KeepTextBoxDisplaySynchronizedWithTextProperty = false;
    

    Sebastian Lux's blog: 在 .NET 4.5 中,默认情况下不再可以使用 UpdateSourceTrigger = PropertyChanged 输入分隔符(逗号或点)。微软表示,这是有意的。

    【讨论】:

    • 链接已损坏,这当然是您不应提供仅链接答案的原因。
    • @A.R.这是完整的答案。就一行代码。该链接仅用于学分。
    • 它只是建议“试试这个”,这意味着它可能不起作用。没有解释,没有上下文。只是一个断开的链接。如果您认为一个班轮可以完成所有工作,请至少进行编辑并删除损坏的链接。
    • 请注意,这将影响所有文本框。 social.msdn.microsoft.com/Forums/vstudio/en-US/…
    【解决方案2】:

    尝试将 StringFormat 定义添加到绑定。 像这样:

    <TextBox Name="txtPower" Height="23" 
        TextWrapping="Wrap" Text="{Binding Path=Power, Mode=TwoWay, 
        UpdateSourceTrigger=PropertyChanged,StringFormat=N2}"></TextBox>
    

    【讨论】:

    • 我使用了 StringFormat={}{##.##} 这对我有用。不确定N2是什么。谢谢!
    • @LukeSolar 这是给你的答案stackoverflow.com/questions/4506323/…
    • 虽然这解决了输入类似 1.1 的问题,但它增加了多个问题,例如数字始终以小数显示(即 1 显示为 1.00),在框中使用退格键或删除键将不起作用因为某些原因。将光标放在点之前,然后输入 .11 会得到 1.11.11
    • @pixel 我遇到了同样的行为,IHMO 这是不可用的。除了将 UpdateSourceTrigger 更改为 LostFocus 之外,您是否找到任何解决方案?
    • 如果您需要UpdateSourceTrigger=PropertyChanged,那么对于任何与StringFormat 苦苦挣扎的人来说,可能的解决方法是绑定到string 属性,然后在setter 中验证该字符串。您还可以在逻辑上将其连接到 floatdoubledecimal 属性,因此这两个值将同步。
    【解决方案3】:

    修复文本框绑定到十进制或浮点数中的点和逗号问题

    1-  UpdateSourceTrigger = LostFocus 
    2-  add string format StringFormat={}{0:#.##} to escape unneeded zeros 
    
    
    <TextBox Name="txtPower" Height="23" 
             TextWrapping="Wrap" Text="{Binding Path=Power, Mode=TwoWay, 
             UpdateSourceTrigger=LostFocus ,StringFormat={}{0:#.##}}"></TextBox>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-17
      • 2014-09-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 2022-01-18
      相关资源
      最近更新 更多