我有一个绑定到属性的TextBox,我已将其UpdateSourceTriggerProperty 设置为Explicit可以控制何时进行验证.但是,只要UI加载控件验证.我从来没有从后面的代码调用UpdateSource方法进行绑定.我不确定为什么会这样,但我不知道如何解决它.
有没有理由UpdateSourceTrigger="Explicit"不工作?
请帮忙!谢谢!
编辑:最初TextBox为空,在验证时会导致验证错误.我想避免这种情况.我想仅在文本框失去焦点或单击验证按钮时才显式验证.现在,如果我理解正确的话,我需要做的就是在TextBox_LostFocus处理程序中为BindingExpression调用UpdateSource方法,并为按钮调用Click事件处理程序.但是,我无法弄清楚如何避免初始验证,或者在我点击TextBox之前避免验证.我已经使用了一种解决方法(我不喜欢),但我更愿意找到一种更好的方法.
我正在使用MVVM,是的.谢谢你的解释!这非常有帮助.
进一步编辑:是的,我正在使用IDataErrorInfo
这是正常的行为.
在DependencyProperty中指定的绑定表达式(在本例中为Text)将在初始化/加载元素时执行初始绑定(并从Source更新目标...即TextBox的Text属性设置为值in具有指定路径的Source中的属性(nb忽略当前未指定Path的情况)).
UpdateSourceTrigger="Explicit" 只是停止Target中的值的自动更新(即TextBox的Text属性)被发送到你的Source(例如ViewModel/model)....(不要混淆这个选项与控制更新的目标).
在初始绑定期间,我想象绑定引擎看到"source"有一个IDataErrorInfo,因此它检查"item"是否有效......如果没有...你得到你的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;
}
}
}
Run Code Online (Sandbox Code Playgroud)
发生Loaded事件后,在模型上设置DoValidation属性.