带有验证的文本框。即使输入的文本无效,如何更新目标属性?

时间:2018-08-28 13:08:50

标签: .net wpf mvvm binding validationrules

我的视图中有一个TextBox,绑定到了我的ViewModel中的属性MyText。我还输入了ValidationRule

这是我视图中的TextBox

<TextBox>
    <TextBox.Text>
        <Binding Path="MyText"
                 UpdateSourceTrigger="PropertyChanged" 
                 Mode="TwoWay"
                 ValidatesOnNotifyDataErrors="True"
                 ValidatesOnDataErrors="True"
                 NotifyOnValidationError="True">
            <Binding.ValidationRules>
                <local:FormulaValidationRule />
            </Binding.ValidationRules>
        </Binding>
    </TextBox.Text>
</TextBox>

这是我的验证类:

Public Class MyTextValidationRule
    Inherits ValidationRule

    Public Overrides Function Validate(value As Object, cultureInfo As CultureInfo) As ValidationResult

        Dim validationRes = MyParser.ValidateText(value)
        If validationRes Then
            Return ValidationResult.ValidResult
        Else
            Return New ValidationResult(False, "Input is not valid")
        End If
    End Function
End Class

我想要的是即使输入的文本无效,我的属性MyText也已更新,但是,就像我现在所拥有的一样,该属性仅在文本为已验证。有什么方法可以做到,即更新属性或访问我的TextBox的文本?

2 个答案:

答案 0 :(得分:2)

ValidationStep的{​​{1}}属性设置为ValidationRule将导致它在更新源属性后 运行:

UpdatedValue

默认值为<Binding.ValidationRules> <local:FormulaValidationRule ValidationStep="UpdatedValue" /> </Binding.ValidationRules> ,这意味着验证规则是在值转换和设置source属性之前运行的。

答案 1 :(得分:0)

如果要显示可见的指示符来指示输入错误,但仍然保留它的记录,该怎么办是使用ValidatesOnExceptions,下面的文章对此做了很好的解释: Data Validation in WPF

这是为了表示后备属性发生转换错误,但是没有什么可以阻止您将值带入属性设置器中的ViewModel字段,然后执行解析并根据需要抛出Exception。这样,您将获得一个值集的副本,而且还拥有显示错误的UI。