将updatesourcetrigger设置为失去焦点时,验证不会被触发

时间:2016-12-22 14:06:15

标签: wpf xaml

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

<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>            

任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

Field的拼写错误:

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

<强>更新

来自MSDN上的 UpdateSourceTrigger Enumeration页面:

PropertyChanged:每当绑定目标属性发生更改时立即更新绑定源,这意味着每次绑定属性更改时都会更新源值。

,而

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

正如Jim Zhou所说here,我们可以调用BindingExpression.UpdateSource方法来强制重置数据源。所以在这种情况下,我们可以在LostFocus上挂起TextBox事件并调用 明确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

希望有所帮助。:)