WPF StringFormat允许仅输入正数

4

我希望在我的文本框中只允许用户输入正数。

如果我输入 -10 并使用

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

如果始终显示正数,但数据仍然是负数,该怎么办?

如何正确处理?


你不能使用 StringFormat 来完成它。你处理了 Width 属性的 setter 吗?如果没有,你需要处理 TextBox 上的 PreviewTextInput 事件。 - dkozl
我可以使用 Interaction.Behaviors 来完成,但我更喜欢使用普通的 StringFormat - juergen d
1
StringFormat 不是这样使用的。最可靠的解决方案应该在属性的 setter 中包含 Math.Abs(value),然后触发 PropertyChanged 事件。但如果你不能这样做,就使用 Interaction.Behaviors 解决方案。 - dkozl
2个回答

3

由于验证规则强制值为正数,因此我建议在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包含新值,但是新值是如何进入其中的? - Binarus
不错,代码示例已更新。 - ΩmegaMan
我明白了。非常感谢您的快速回复。已点赞... - Binarus
另一种选择是将提供有效字符串的逻辑放入XAML转换器中。查找相关示例,这可能更与您的情况相关。 - ΩmegaMan
非常感谢您!是的,我已经看到过这样的转换器了。目前我只是尽可能多地阅读文档和示例,并试图理解您的代码 :-) 因此有问题... - Binarus

3

有许多方法可以处理这个问题,例如OmegaMan的解决方案。但是我的解决方案是根本不使用文本框。遗憾的是,WPF从未拥有过一个出色的旋转框/上下控件,但是扩展的WPFToolkit确实有一个。那么为什么要浪费时间来解析和处理所有糟糕的情况呢?让控件来完成繁重的工作。

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

完成


链接已失效。 - Maximojo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接