【问题标题】:WPF StringFormat to allow only positive numbersWPF StringFormat 只允许正数
【发布时间】:2015-06-17 17:07:03
【问题描述】:

我只想在我的 TextBox 中允许正数作为用户输入。

如果我输入-10 并使用

<TextBox Text="{Binding Width, StringFormat={}{0:0.00;0.00}}" />

那么它总是显示正数,但后面的数据仍然是负数。

怎么做才对?

【问题讨论】:

  • 你不会用StringFormat来做这件事。您是否处理 Width 属性的设置器?如果不是,您将需要处理 TextBox 上的 PreviewTextInput 之类的事件@
  • 我可以用Interaction.Behaviors 来做,但我更喜欢简单的StringFormat
  • StringFormat 不能这样工作。最强大的解决方案会在属性的设置器中包含Math.Abs(value),然后引发PropertyChanged 事件。但是,如果您不能这样做,请使用您的 Interaction.Behaviors 解决方案

标签: c# wpf validation mvvm string-formatting


【解决方案1】:

有很多方法可以处理这个问题,比如 OmegaMan 的。但我对此的解决方案是根本不使用文本框。遗憾的是,WPF 从来没有开箱即用的 spinbox/updown 控件,但 extended WPFToolkit 确实有一个。那么,为什么要把时间浪费在解析和处理所有令人讨厌的案例上呢?让控件完成繁重的工作。

<extToolkit:IntegerUpDown Value="{Binding Width}" Minimum="0"/>

完成

【讨论】:

  • 链接不再有效
【解决方案2】:

由于验证规则强制该值为正,我建议同时检查 VM 属性中的值以强制/转换它:

private string _width;

public string Width
{
   get { return _width; }
   set 
       {
          int result;
          int.TryParse(value, out result);
          _width = (result < 0 ? result *-1 : result).ToString();   
          PropertyChanged("Width");
       } 
}

【讨论】:

  • 我对此完全陌生,下面的问题可能不仅仅是愚蠢的。但是您能否简要解释一下代码中的 setter 是如何工作的?到目前为止,在我看到的每个示例中,setter 都会处理一个名为 value 的变量,其中包含属性的新值。您的 setter 从哪里获得新值,width 来自哪里(在 int.TryParse(...) 中)?显然,width 包含了新值,但是新值是如何进入的?
  • 好收获。更新了代码示例。
  • 我明白了。非常感谢您的快速回复。赞成...
  • 另一种选择是将提供有效字符串的逻辑放入 xaml 转换器中。查找示例,它可能与您的情况更相关。
  • 再次非常感谢您!是的,我见过这样的转换器。我目前正在阅读尽可能多的文档和示例,并试图理解您的代码:-) 因此问题...
猜你喜欢
  • 2016-03-24
  • 2012-09-05
  • 1970-01-01
  • 1970-01-01
  • 2016-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多