【问题标题】:WPF: Datagrid validation not on a row level but on a collection levelWPF:数据网格验证不是在行级别,而是在集合级别
【发布时间】:2019-11-22 08:02:47
【问题描述】:
我有一个实现一些验证规则的数据网格。如果这些后者返回该行无效,则该行被标记为错误(行标题中的红色图标)。基本的东西。
现在,我想在整个集合上实施验证规则。例如,我有一列显示每个源集合项的名称,我希望这个名称在整个集合中是唯一的。当三行显示一个共享名称时,我希望它们都在行标题中显示红色错误图标。
我考虑在修改此名称属性时在模型的类中引发一个事件,然后从视图模型中监听此事件,但感觉编码错误。而且我不知道我是否可以达到结果(将行标记为错误)。
有没有更好的办法?
【问题讨论】:
标签:
wpf
validation
datagrid
【解决方案1】:
好的,这就是我最终做的事情,请让我知道这是否肮脏、不好的做法等。
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));
}
...
话虽如此,您也可以简单地在验证规则中添加一个参数...