我正在实施 IDataErrorInfo
然后决定实施 INotifyDataErrorInfo
. 。我当时想将这项验证工作我需要实现两个接口。所以我基本上删除了 IDataErrorInfo
从我的班级实施,这解决了问题。
使用InotifyDataErrorinfo
-
29-07-2022 - |
题
在我的课上,我正在实施 INotifyDataErrorInfo
当验证错误发生时,它可以正常工作。它把那个红色框架围绕在文本框上,但是在修复验证错误时,它并没有消除它。
这是我的代码:
string IDataErrorInfo.this[string columnName]
{
get
{
string error = null;
if (Context != null)
{
var messages = //GetMessages(); messages are validation errors
if (messages.Count != 0)
{
error = "This is critical error. Must be fixed";
AddError(columnName, "Some kind of error happend", false);
}
else
{
RemoveError(columnName);
}
}
return error;
}
}
//I call this method to check for validation errors.
public void CheckValidationErrors(string propertyName)
{
var error = this as IDataErrorInfo;
string message = error[propertyName];
}
private Dictionary<String, List<String>> errors =
new Dictionary<string, List<string>>();
public void AddError(string propertyName, string error, bool isWarning)
{
if (!errors.ContainsKey(propertyName))
errors[propertyName] = new List<string>();
if (!errors[propertyName].Contains(error))
{
if (isWarning) errors[propertyName].Add(error);
else errors[propertyName].Insert(0, error);
RaiseErrorsChanged(propertyName);
}
}
public void RemoveError(string propertyName, string error="")
{
if (error == "")
{
errors.Remove(propertyName);
RaiseErrorsChanged(propertyName);
}
else
{
if (errors.ContainsKey(propertyName) &&
errors[propertyName].Contains(error))
{
errors[propertyName].Remove(error);
if (errors[propertyName].Count == 0) errors.Remove(propertyName);
RaiseErrorsChanged(propertyName);
}
}
}
public void RaiseErrorsChanged(string propertyName)
{
if (ErrorsChanged != null)
ErrorsChanged(this, new DataErrorsChangedEventArgs(propertyName));
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public System.Collections.IEnumerable GetErrors(string propertyName)
{
if (String.IsNullOrEmpty(propertyName) ||
!errors.ContainsKey(propertyName)) return null;
return errors[propertyName];
}
public bool HasErrors
{
get { return errors.Count > 0; }
}
我正在调用remove error()方法以删除错误。难道我做错了什么?验证固定后,我需要转到文本框和标签会照顾它。我想在验证错误消失时立即删除该红色框架。
更新:
当我将某些内容输入文本框时,我需要将该信息异步发送到服务器,如果有任何验证问题,响应将为我带来一条消息。因此,我无法对属性进行验证。如果添加或删除了任何消息,我将检查是否响应。如果删除了,则我将致电CheckValidationErrors()。
回答
我正在实施 IDataErrorInfo
然后决定实施 INotifyDataErrorInfo
. 。我当时想将这项验证工作我需要实现两个接口。所以我基本上删除了 IDataErrorInfo
从我的班级实施,这解决了问题。
谢谢您的帮助!
解决方案 2
其他提示
默认值的 UpdateSourceTrigger
为了 TextBox
是 LostFocus
.
你应该将其更改为 PropertyChanged
如果您想立即运行验证逻辑,一旦解决了错误。
<TextBox Text="{Binding PropertyName, UpdateSourceTrigger=PropertyChanged}"/>
不隶属于 StackOverflow