WPF UpdateSourceTrigger

时间:2012-09-05 18:51:58

标签: wpf data-binding

我有一个绑定到属性的TextBox,我将其UpdateSourceTrigger属性设置为Explicit,以便我可以控制它何时进行验证。但是,只要UI加载控件验证。我从来没有从后面的代码调用UpdateSource方法进行绑定。我不知道为什么会这样,但我不知道如何解决它。

UpdateSourceTrigger="Explicit"无法正常工作吗?

请帮忙! 谢谢!

编辑: 最初TextBox为空,在验证时会导致验证错误。我想避免这种情况。我想仅在文本框失去焦点或单击验证按钮时才显式验证。现在,如果我理解正确的话,我需要做的就是在TextBox_LostFocus处理程序中为BindingExpression调用UpdateSource方法,并为按钮调用Click事件处理程序。但是,我无法弄清楚如何避免初始验证,或者在我点击TextBox之前避免验证。我使用了一种解决方法(我不喜欢),但我更愿意找到一种更好的方法。

我正在使用MVVM,是的。谢谢你的解释!这非常有帮助。

进一步编辑: 是的,我正在使用IDataErrorInfo

1 个答案:

答案 0 :(得分:7)

这是正常行为。

在DependencyProperty中指定的绑定表达式(在本例中为Text)将在初始化/加载元素时执行初始绑定(并从Source更新目标...即TextBox的Text属性设置为具有指定路径的Source中属性中的值(nb忽略当前未指定Path的情况))。

UpdateSourceTrigger="Explicit"只是停止将Target中的值(即TextBox的Text属性)的自动更新发送到您的Source(例如ViewModel / model)....(不要混淆此选项用于控制目标的更新。

在初始绑定期间,我想象绑定引擎看到“source”有一个IDataErrorInfo,因此它会检查“item”是否有效......如果没有......你会得到标准错误adorner围绕TextBox(由ErrorTemplate定义)....以便它匹配模型中数据的状态....这都是合乎逻辑的。

要在初始加载视图后停止显示过于错误的错误指示符...您可以尝试此解决方法。

您可以更改IDataErrorInfo,以便控制它何时执行验证检查逻辑。

在加载视图后设置一个标志...允许运行IDataErrorInfo验证代码......而不是之前。

从该点开始加载后,对UpdateSource的调用将触发Validator,它将捕获无效数据(因为您的Loaded标志将为true,并且您的验证逻辑将实现它的魔力)。

您可以使用以下内容:

public class CustomerViewModel : IDataErrorInfo
{
    public bool DoValidation { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public string Error
    {
        get
        {
            if (DoValidation)
            {
                if (error on any properties)
                     return "error on these .....";
            }
            return null; // no errors
        }
    }

    public string this[string columnName]
    {
        get
        {
            if (!DoValidation)
            {
                return null; 
            }

            string result = null;
            if (columnName == "FirstName")
            {
                if (string.IsNullOrEmpty(FirstName))
                    result = "Please enter a First Name";
            }
            if (columnName == "LastName")
            {
                if (string.IsNullOrEmpty(LastName))
                    result = "Please enter a Last Name";
            }

            return result;
        }
    }
}

在Loaded事件发生后,在模型上设置DoValidation属性。