我有以下XAML:
<TextBox Name="LevyWageLimitFormulaID_TextBox"
Width="150"
HorizontalAlignment="Center"
Grid.Row="4" Grid.Column="1">
<TextBox.Text>
<Binding Path="SelectedStateRule.LevyRule.WageLimitFormulaID"
UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<vm:NumericValidator ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
验证器定义如下:
/// <summary>
/// Numeric Validator to make sure value is numeric
/// </summary>
public class NumericValidator : ValidationRule
{
/// <summary>
/// Validate field is blank or contains only numbers
/// </summary>
/// <param name="value"></param>
/// <param name="cultureInfo"></param>
/// <returns></returns>
public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
{
Decimal _number;
if (!Decimal.TryParse((value as string), out _number) && !String.IsNullOrEmpty(value as string))
{
return new ValidationResult(false, "Value must be numeric");
}
return ValidationResult.ValidResult;
}
}
这一切正常,直到我尝试输入十进制数字。如果我在文本框中输入'10.'
,小数点将被删除(用户永远不会看到小数点出现在文本框中)。如果我输入'100'
然后手动移动光标并添加小数点以使值'10.0'
验证起作用并保留小数点。
我知道这是由out _number
的{{1}}部分引起的,并且一旦属性发生变化就会执行验证(这是要求之一),但是有一个修复此方法的方法,以便我可以键入Decimal.TryParse
并将小数点保留在文本框中?
答案 0 :(得分:1)
这不是由您的ValidationRule引起的。如果您暂时删除ValidationRule,您将遇到相同的行为。
问题是decimal
源属性不能设置为除decimal
值和&#34; 10之外的其他内容。&#34;确实不是有效的decimal
值。
您可以做的是绑定到设置string
属性的包装器decimal
属性:
//add this wrapper property to your class:
private string _wrapper;
public string Wrapper
{
get { return _wrapper; }
set
{
_wrapper = value;
decimal d;
if (Decimal.TryParse(_wrapper, out d))
WageLimitFormulaID = d;
}
}
private decimal _wageLimitFormulaID;
public decimal WageLimitFormulaID
{
get { return _wageLimitFormulaID; }
set { _wageLimitFormulaID = value; }
}
<TextBox Name="LevyWageLimitFormulaID_TextBox"
Width="150"
HorizontalAlignment="Center"
Grid.Row="4" Grid.Column="1">
<TextBox.Text>
<Binding Path="SelectedStateRule.LevyRule.Wrapper" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<vm:NumericValidator ValidatesOnTargetUpdated="True" />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>