【问题标题】:Validation is not getting fired when setting updatesourcetrigger to lost focus将 updatesourcetrigger 设置为失去焦点时不会触发验证
【发布时间】:2016-12-23 19:36:16
【问题描述】:

我正在使用下面的代码来验证文本框。

<TextBox.Text>
            <Binding Path="Name" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True">
                <Binding.ValidationRules>
                    <Validate:RquiredFiledValidation  ErrorMessage="Please Provide Login Name"></Validate:RquiredFiledValidation>
                </Binding.ValidationRules>
            </Binding>

上面的代码工作正常,但是当将 updatesourcetrigger 更改为 Lostfocus 时它停止工作。

<TextBox.Text>
            <Binding Path="Name" UpdateSourceTrigger="LostFocus" ValidatesOnDataErrors="True">
                <Binding.ValidationRules>
                    <Validate:RquiredFiledValidation  ErrorMessage="Please Provide Login Name"></Validate:RquiredFiledValidation>
                </Binding.ValidationRules>
            </Binding>
        </TextBox.Text>            

任何帮助将不胜感激。

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

    Field的拼写错误:

    <Validate:RquiredFieldValidation ErrorMessage="Please Provide Login Name"></Validate:RquiredFieldValidation>
    

    更新:

    来自 MSDN 上的 UpdateSourceTrigger Enumeration 页面:

    PropertyChanged:每当绑定目标属性发生变化时立即更新绑定源,也就是说每次绑定属性发生变化时都会更新源值。

    而

    LostFocus:每当绑定目标元素失去焦点时更新绑定源,即每次目标控件失去焦点时都会更新源值。如果您不对目标进行任何属性更改,源将保持不变。

    正如 Jim Zhou 所说的 here,我们可以调用 BindingExpression.UpdateSource 方法来强制重置数据源。所以在这种情况下,我们可以在TextBox 上连接LostFocus 事件并调用 BindingExpression.UpdateSource 方法明确。像这样的:

    private void OnLostFocus(object sender, RoutedEventArgs e)
        {
            TextBox text = sender as TextBox;
            BindingOperations.GetBindingExpression(text, TextBox.TextProperty).UpdateSource();
        }
    

    还可以查看 ValidationRule 的 ValidatesOnTargetUpdated 属性。它将在首次加载数据时进行验证。如果您尝试捕获空字段或空字段,这很好。您可以在绑定验证规则中添加类似的内容:

    <DataErrorValidationRule ValidatesOnTargetUpdated="True" />
    

    相关性不大,但您可能喜欢dkozl's answer。

    希望对您有所帮助。:)

    【讨论】:

    • 谢谢,但这不是问题 :)
    • 如何在 MVVM 中实现相同的目标。我不想在后面的代码中编写代码。我知道技巧背后的代码,但是 MVVM 呢。
    • 在这种情况下,您将需要使用 EventTrigger。看看here。 SetProperty 触发操作将帮助您实现这一目标。
    • 同时使用PropertyChanged 和LostFocus 怎么样? this question 中的类似内容?
    猜你喜欢
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    相关资源
    最近更新 更多