C# WPF StringFormat仅允许正数

C# WPF StringFormat仅允许正数,c#,wpf,validation,mvvm,string-formatting,C#,Wpf,Validation,Mvvm,String Formatting,我只想允许用户在我的文本框中输入正数 如果我输入-10并使用 <TextBox Text="{Binding Width, StringFormat={}{0:0.00;0.00}}" /> 然后它总是显示正数,但后面的数据仍然是负数 如何正确执行?由于验证规则强制值为正值,我建议也检查VM属性中的值以强制/转换它: public string Width { get { return _width; } set { int re

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

如果我输入
-10
并使用

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

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


如何正确执行?

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

public string Width
{
   get { return _width; }
   set 
       {
          int result;
          int.TryParse(width, out result);
          _width = (result < 0 ? result *-1 : result).ToString();   
          PropertyChanged("Width");
       } 
}
公共字符串宽度
{
获取{return\u width;}
设置
{
int结果;
int.TryParse(宽度,输出结果);
_宽度=(结果<0?结果*-1:结果).ToString();
财产变更(“宽度”);
} 
}

有很多方法可以解决这个问题,比如OmegaMan's。但我的解决方案是根本不使用文本框。不幸的是,WPF从未拥有现成的spinbox/updown控件,但它确实有一个。那么,为什么要把时间浪费在分析和处理所有讨厌的案例上呢?让控制装置来完成繁重的工作

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


完成

您不会使用
StringFormat
完成。您是否处理
Width
属性的setter?如果没有,你需要在
TextBox
上处理
previewtextemput
事件,我可以通过
交互来完成。行为
,但我更喜欢用普通的
StringFormat
StringFormat
来处理。最可靠的解决方案是在属性的setter中包含
Math.Abs(value)
,然后引发
PropertyChanged
事件。但是,如果您不能做到这一点,请使用您的
交互行为
解决方案