验证表单上显示为null / empty的已删除十进制值

时间:2017-05-03 13:24:57

标签: c# xaml

我之前问过这个问题 XAML - setting textbox contents to zero when user deletes contents我收到了可行的解决方案。

我现在被要求改变这种方式。而不是将文本设置为" 0"当用户删除文本框内容时,它必须是必填字段。

因此,如果用户删除文本内容而不是键入" 0",我需要将其视为null以强制进行某些验证。 问题是在删除时,原始值保存在模型中,因为它是小数,并且不能设置为null,如果我按照上一个问题的答案建议,那么我将其设置为0关于删除,无论哪种方式,我都似乎无法强制验证。

我在想,有没有办法从viewmodel检查文本是否为空?我意识到这必须与观点分开,所以在技术上你不应该看这种方法,但我只是试图阐明我想要做的事情。

1 个答案:

答案 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属性。