这是正常的行为。
在您的 DependencyProperty 中指定的绑定表达式(即本例中的文本)将在元素初始化/加载时进行初始绑定(并从源更新目标...即 TextBox 的 Text 属性设置为中的值具有指定路径的源中的属性(请忽略暂时未指定路径的情况))。
UpdateSourceTrigger="Explicit"
只是停止将目标中的值(即 TextBox 的 Text 属性)发送到源(例如 ViewModel/model)的自动更新....(不要将此选项与控制更新目标)。
在初始绑定期间,我想象绑定引擎看到“源”具有 IDataErrorInfo,因此它检查“项目”是否有效......如果不是......你会得到围绕你的 TextBox 的标准错误装饰器(由 ErrorTemplate 定义) ....使其与模型中数据的状态相匹配....这都是合乎逻辑的。
要在初始加载视图后阻止错误指示器过于激进地显示...您可以尝试此解决方法。
您可以更改您的 IDataErrorInfo 以便您可以控制它何时执行验证检查逻辑。
在视图加载后设置一个标志......它允许运行 IDataErrorInfo 验证代码......而不是之前。
从那时起加载后,对 UpdateSource 的调用将触发 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 属性。