我有一个实现 IDataErrorInfo 和主细节视图的 ViewModel。当用户点击详细视图中的保存按钮而不是更早时,如何触发当前 ViewModel 项的验证?
问问题
4593 次
2 回答
6
首先在您的 VM 上包含一个标志,将其初始设置为 false。在您的 Button 命令代码中(假设您已将按钮绑定到 VM 上的命令),在运行验证代码之前打开标志。
在 IDataErrorInfo 属性中的“get”代码中,如果标志设置为 true,则仅返回验证错误,否则返回空字符串。
在将标志切换回 false 之前,引发一个使用空字符串作为属性名称的 PropertyChangedEvent,这将强制绑定系统重新评估当前上下文中的所有绑定,并针对 IDataErrorInfo 检查错误。
于 2011-03-06T13:02:39.600 回答
6
本皮尔斯给出了一个很好的答案。
正如他指出的那样。
- 在
this[columnName]
您单击“保存”之前返回 null(即使数据无效) - 在 Save 命令中,您需要调用
OnPropertyChanged(null)
以让 WPF 重新评估绑定(并询问索引器)
此示例不使用标志,而是使用字典来实现相同的结果。
在视图中
<TextBox Text="{Binding Surname, ValidatesOnDataErrors=True}" />
在视图模型中
public string Surname { get; set; }
#region Validation
//http://blogs.msdn.com/b/bethmassi/archive/2008/06/27/displaying-data-validation-messages-in-wpf.aspx
Dictionary<string, string> validationErrors = new Dictionary<string,string>();
void Validate()
{
validationErrors.Clear();
if (srtring.IsNullOrWhitespace(Surname)) // Validate Surname
{
validationErrors.Add("Surname", "Surname is mandatory.");
}
//http://stackoverflow.com/a/5210633/240835
// Call OnPropertyChanged(null) to refresh all bindings and have WPF check the this[string columnName] indexer.
OnPropertyChanged(null);
}
#region IDataErrorInfo Members
public string Error
{
get
{
if (validationErrors.Count > 0)
{
return "Errors found.";
}
return null;
}
}
public string this[string columnName]
{
get
{
if (validationErrors.ContainsKey(columnName))
{
return validationErrors[columnName];
}
return null;
}
}
#endregion
#endregion
public void Save()
{
Validate();
if (validationErrors.Count == 0)
{
DoSave();
}
}
于 2013-12-20T22:50:56.433 回答