我之前问过这个问题 XAML - setting textbox contents to zero when user deletes contents我收到了可行的解决方案。
我现在被要求改变这种方式。而不是将文本设置为" 0"当用户删除文本框内容时,它必须是必填字段。
因此,如果用户删除文本内容而不是键入" 0",我需要将其视为null以强制进行某些验证。 问题是在删除时,原始值保存在模型中,因为它是小数,并且不能设置为null,如果我按照上一个问题的答案建议,那么我将其设置为0关于删除,无论哪种方式,我都似乎无法强制验证。
我在想,有没有办法从viewmodel检查文本是否为空?我意识到这必须与观点分开,所以在技术上你不应该看这种方法,但我只是试图阐明我想要做的事情。
答案 0 :(得分:2)
需要在视图中进行验证。 Validation rules are the natural choice for how to do it。视图模型不能也不应该知道视图存在,更不用说有任何对控件的引用。这将是痛苦的实施,甚至更痛苦的生活。
public class RequiredDecimalRule : ValidationRule
{
public RequiredDecimalRule()
{
}
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
decimal d;
if (value == null || !Decimal.TryParse(value.ToString(), out d))
{
return new ValidationResult(false, "Numeric value is required");
}
return new ValidationResult(true, null);
}
}
XAML
<TextBox
>
<TextBox.Text>
<Binding
Path="SomeDecimalPropertyOnYourViewModel">
<Binding.ValidationRules>
<local:RequiredDecimalRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
如果您不允许触摸视图,那么您不应对此验证负责。但有时候会发生这种情况。你所做的是有两个属性:一个十进制和一个字符串。字符串1绑定到视图中的文本框。实际的十进制数不绑定到视图。当任一属性获得新值时,它会更新另一个属性。在字符串1获取null或空字符串的情况下,执行错误操作而不是更新decimal属性。