1

我的视图上有一个文本框,它有一个验证规则:

public class EmptyStringRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
       if(String.IsNullOrEmpty(value.ToString()))
           return new ValidationResult(true,"String Cannot be empty");
        return new ValidationResult(true,null);
    }
}

当输入一个空字符串时。绑定属性未更新,文本框标记为红色。我需要更新源,但仍将标记保留在文本框周围。(输入稍后由 EF 再次验证)。

我该怎么做?

4

1 回答 1

6

您可以通过将验证规则的 ValidationStep 属性设置为“UpdatedValue”来做到这一点:

<Binding.ValidationRules>
    <c:EmptyStringRule ValidationStep="UpdatedValue"/>
</Binding.ValidationRules>

请注意,这会导致将 BindingExpression 传递给验证规则类,而不是实际的字段值,因此您必须相应地修改验证规则,以查询更新字段的值。(在我的示例中,绑定的字符串属性称为 MyViewModel.MyStringProperty):

public class EmptyStringRule : ValidationRule
{
    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        var be = value as BindingExpression;
        if (be != null)
        {
            var item = be.DataItem as MyViewModel;
            if (item != null)
            {
                if (String.IsNullOrEmpty(item.MyStringProperty))
                {
                    return new ValidationResult(false, "String Cannot be empty");
                }
            }
        }
        return new ValidationResult(true, null);
    }
}

通过这种设置,当文本设置为空时,它实际上应该对 MyStringProperty 进行更新,但仍会进行验证。

于 2012-11-28T13:16:08.597 回答