Проверка данных в Observable Collection дочерний - PullRequest
0 голосов
/ 08 апреля 2020

Я хочу иметь список свойств разных типов. Каждое свойство (например, BoolProperty, StringProperty, ..) происходит от класса PropertiesBase. Класс PropertiesBase имеет член PropertyName.

Таким образом, существует ObservableCollection<PropertiesBase>, с которым связывается источник данных DataSrid. Я использую WPF с MVVMLight.

Если 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 member PropertyName, если имя уникально?

Как эта коллекция может быть загружена из JSON Я не могу передать ссылку на коллекцию в дочерние конструкторы.

Спасибо за любую помощь!

1 Ответ

1 голос
/ 08 апреля 2020

Должно быть понятно, что один объект не может выполнить какую-либо проверку на основе каких-либо значений в других объектах, поскольку он ничего о них не знает.

Вы должны либо выполнить проверку в самой коллекции, либо в классе, который создает экземпляр коллекции и сохраняет ссылку на нее.

Вы можете, например, обработать событие CollectionChanged и подключить обработчик события к событию PropertyChanged для каждого добавляемого PropertiesBase в коллекцию. Вы выполняете проверку в обработчике ошибок. Это должно быть легко, поскольку у вас есть доступ ко всем элементам.

Когда дело доходит до «пометки» и сущности как недействительной, вы можете, например, сделать это, используя свойство IsValid или подобное. Если вы реализуете интерфейс INotifyDataErrorInfo в своем классе модели, вы можете, например, вызвать событие ErrorsChanged всякий раз, когда IsValid устанавливается в обработчике события.

Если вы хотите чтобы выполнить проверку в установщиках свойств модели, вы должны каким-либо образом получить ссылку на коллекцию в классе модели. Обойти это невозможно.

...