【问题标题】:WPF UpdateSourceTriggerWPF 更新源触发器
【发布时间】:2012-09-05 18:51:58
【问题描述】:

我有一个绑定到属性的 TextBox,我已将其 UpdateSourceTrigger 属性设置为 Explicit 以便我可以控制它何时验证。但是,一旦 UI 加载,控件就会验证。我从不从后面的代码中调用 UpdateSource 方法进行绑定。我不确定为什么会发生这种情况,但我不知道如何解决。

UpdateSourceTrigger="Explicit" 不起作用有什么原因吗?

请帮忙! 谢谢!

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

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

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

【问题讨论】:

  • 您能复制并粘贴您正在使用的 XAML 吗...谢谢。

标签: wpf data-binding


【解决方案1】:

这是正常行为。

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

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

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

要在初始加载视图后阻止错误指示器过于激进地显示...您可以尝试此解决方法。

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

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

一旦从该点加载,对 UpdateSource 的调用将触发 Validator,该 Validator 将捕获无效数据(因为您的 Loaded 标志将为真,而您的验证逻辑将发挥作用)。

你可以这样使用:

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 属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多