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

TextBox with Validation. How to update the target property even if the entered text is not valid?

我的视图中有一个 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>

这是我的验证 class:

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?

的文本

如果你想显示输入错误的可见指示器但仍保留记录,你可以做的是使用 ValidatesOnExceptions,下面的文章对此做了很好的解释: Data Validation in WPF

它的意思是如果存在到支持 属性 的转换错误,但是没有什么可以阻止您将值输入 属性 [= 中的 ViewModel 字段16=] 然后执行解析并根据需要抛出异常。这样,您将获得值集的副本以及显示存在错误的 UI。

ValidationRuleValidationStep 属性 设置为 UpdatedValue 将导致它 运行 after 来源 属性 已更新:

<Binding.ValidationRules>
    <local:FormulaValidationRule ValidationStep="UpdatedValue"  />
</Binding.ValidationRules>

默认值为RawProposedValue,这意味着在值转换发生之前验证规则是运行并且正在设置源属性。