我有一个实现某些验证规则的数据网格。如果这些错误返回该行无效,则将该行标记为错误(行标题中的红色图标)。基本的东西。
现在,我想对整个集合实施验证规则。例如,我有一列显示每个源集合项的名称,并且我希望该名称在整个集合中是唯一的。当三行显示一个共享的命名时,我希望它们全部在行标题中显示红色错误图标。
我曾考虑过在修改此名称属性时在模型的类中引发一个事件,然后从视图模型中侦听此事件,但是在编写代码时感觉不对。而且我不知道我是否可以实现结果(将行标记为错误)。
还有更好的方法吗?
好吧,这就是我最后要做的,如果这很脏,不当行为,请告诉我。
public class MyModel : IDataErrorInfo
{
#region Fields
readonly ObservableCollection<MyModel> _parentCollection;
#endregion
#region Properties
public string Name { get; set; }
#endregion
#region Validation
string _error;
public string Error => _error;
public string this[string columnName]
{
get
{
List<string> foundErrors = new List<string>();
if (string.IsNullOrWhiteSpace(columnName) ||
(columnName == nameof(Name) &&
_parentCollection.Count(ed => ed.Name == Name) > 1))
{
foundErrors.Add("Name already used"));
}
_error = string.Join(Environment.NewLine, foundErrors);
return _error;
}
}
#endregion
#region Constructor
public EvaluationDay(ObservableCollection<MyModel> parentCollection)
: base()
{
_parentCollection = parentCollection;
}
#endregion
}
}
然后,在ViewModel中,每当我向绑定到视图的可观察集合中添加MyModel对象时,我都要确保将OC引用作为对象的构造函数发送给该对象:
public class MyViewModel
{
#region Properties
public ObservableCollection<MyModel> MyModels { get; set; }
#endregion
...
int elementsToAddCount = 10;
for (int i = 0; i < elementsToAddCount; i++)
{
MyModels.Add(new MyModel(MyModels));
}
...
话虽如此,您也可以简单地向验证规则添加参数...