WPF UpdateSourceTrigger

5
我有一个绑定到属性的TextBox,我已将其UpdateSourceTrigger属性设置为Explicit以便我可以控制何时进行验证。但是,只要UI加载控件即开始验证。我从未从代码后台调用绑定的UpdateSource方法。我不确定为什么会发生这种情况,但我不知道如何解决它。
为什么UpdateSourceTrigger="Explicit"不起作用?
请帮帮我! 谢谢!
编辑: 最初,文本框为空,因此在验证时会导致验证错误。我想避免这种情况。我只想在文本框失去焦点或单击验证按钮时才显式验证。现在,如果我理解正确,我只需要在TextBox_LostFocus处理程序和按钮的Click事件处理程序中为BindingExpression调用UpdateSource方法即可。但是,我无法弥补初始验证或在触碰该TextBox之前避免验证。我使用了一种解决方法(我不喜欢),但我更愿意找到更好的方法来解决这个问题。
是的,我正在使用MVVM。谢谢您的解释!这很有帮助。
进一步编辑: 是的,我正在使用IDataErrorInfo。

1
你能复制并粘贴你正在使用的 XAML 吗...谢谢。 - Colin Smith
1个回答

9

这是正常的行为。

在你的DependencyProperty中指定的绑定表达式(即此处的Text)将在元素初始化/加载时进行初始绑定,并更新目标与源,即你的TextBox的Text属性设置为源中指定路径的属性值(注意:暂时忽略未指定路径的情况)。

UpdateSourceTrigger="Explicit"仅停止将目标(即你的TextBox的Text属性)的自动更新发送到源(例如ViewModel/模型)...(不要将此选项与控制目标更新混淆)。

在初始绑定期间,我想绑定引擎会看到“源”具有IDataErrorInfo,因此它检查“项”是否有效......如果无效......您将获得标准错误装饰器,围绕您的TextBox(由ErrorTemplate定义)....以使其与模型中的数据状态匹配....这是所有逻辑上的。

为了防止在视图初始加载后过于频繁地显示错误指示器......您可以尝试使用以下解决方法。

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

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

从那时起加载后,对UpdateSource的调用将触发验证器,该验证器将捕获无效数据(因为您的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属性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接