【问题标题】:TextBox with Validation. How to update the target property even if the entered text is not valid?带有验证的文本框。即使输入的文本无效,如何更新目标属性?
【发布时间】:2019-02-03 03:19:57
【问题描述】:

我的视图中有一个TextBox,绑定到我的视图模型中的一个属性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 的文本?

【问题讨论】:

标签: .net wpf mvvm binding validationrules


【解决方案1】:

ValidationRuleValidationStep 属性设置为UpdatedValue 将导致它在源属性更新后运行

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

默认值为RawProposedValue,表示在值转换发生之前运行验证规则并设置源属性。

【讨论】:

    【解决方案2】:

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

    这意味着如果支持属性存在转换错误,但没有什么可以阻止您将值放入属性设置器中的 ViewModel 字段,然后执行解析并根据需要抛出异常。这样,您将获得值集的副本,以及显示存在错误的 UI。

    【讨论】:

      猜你喜欢
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      • 1970-01-01
      • 2016-06-04
      • 2015-11-09
      相关资源
      最近更新 更多