可观察集合子项中的数据验证



我想要一个不同类型的属性列表。每个属性(例如BoolPropertyStringProperty,..)派生自PropertiesBase类。PropertiesBase类具有成员PropertyName

因此,存在一个 ItemSource 绑定到的数据网格的ObservableCollection<PropertiesBase>。我正在使用带有 MVVMLight 的 WPF。

如果更改了属性的PropertyName,则应验证该名称在可观察集合的上下文中是否唯一。

private string _propertyName;
public string PropertyName
{
get => _propertyName;
set
{
if (NAME_IS_NOT_UNIQUE)           <---- HOW TO SOLVE THIS
{
throw new ArgumentException("Property name must be unique");
}
if (_propertyName == value)
return;
_propertyName = value;
RaisePropertyChanged("PropertyName");
}
}

我现在的问题是:

如何签入PropertiesBase成员PropertyName名称是否唯一?

由于此集合可以从 JSON 加载,因此我无法在子构造函数中移交对该集合的引用。

感谢您的任何帮助!

应该清楚的是,单个实体无法根据其他实体中的任何值执行任何验证,因为它对它们一无所知。

应在集合本身或实例化集合的类中执行验证,并保留对它的引用。

例如,您可以处理CollectionChanged事件,并将事件处理程序挂接到添加到集合中的每个PropertiesBasePropertyChanged事件。在错误处理程序中执行验证。这应该很容易,因为您可以访问所有项目。

当涉及到"标记"和实体无效时,例如,您可以使用IsValid属性或类似属性执行此操作。如果在模型类中实现INotifyDataErrorInfo接口,例如,只要从事件处理程序设置IsValid,就可以引发ErrorsChanged事件。

如果要在模型属性的 setter 中执行验证,则必须以某种方式获取对模型类中集合的引用。这是没有办法的。

最新更新