我想要一个不同类型的属性列表。每个属性(例如BoolProperty
,StringProperty
,..)派生自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
事件,并将事件处理程序挂接到添加到集合中的每个PropertiesBase
的PropertyChanged
事件。在错误处理程序中执行验证。这应该很容易,因为您可以访问所有项目。
当涉及到"标记"和实体无效时,例如,您可以使用IsValid
属性或类似属性执行此操作。如果在模型类中实现INotifyDataErrorInfo
接口,例如,只要从事件处理程序设置IsValid
,就可以引发ErrorsChanged
事件。
如果要在模型属性的 setter 中执行验证,则必须以某种方式获取对模型类中集合的引用。这是没有办法的。