Я гуглил ответ на этот вопрос уже более двух недель. Обычно это означает, что я либо слепой, либо идея абсурдна. В любом случае:
В довольно гибком проекте среднего размера данные конфигурации хранятся в иерархической структуре, подобной этой:
- Конфигурация (сборник)
- Аудио (класс)
- BaseDir (структура)
- PlayMode (enum)
- Вход (класс)
- CalibrateOnConnect (bool)
- KnownDevices (коллекция)
- ... (класс)
- UseDevice (целое число)
- Плейлист (коллекция)
- FirstAudio (класс)
- Путь (строка)
- Повтор (целое число)
- ...
Мне уже удалось отобразить их в TreeView в виде шаблона MVVM. Поскольку я не могу точно сказать, какие опции будут добавлены в будущем, я использовал общий подход, создавая ViewModels для class
, ienumerable
, мои пользовательские structs
и основные типы значений (string
, bool
, enum
, ...).
В моем XAML они имеют соответствующие (иерархические) шаблоны данных, например, с CheckBox для логических значений или текстовым блоком для типов общих значений.
Каждый экземпляр ViewModel имеет поле для хранения данных базовой модели.
Мне удается отредактировать эти значения в View и через TwoWay-Binding также в ViewModel.
Но что заставляет мою голову болеть, так это то, как обновлять эти данные в модели.
Поскольку я создаю иерархическую структуру ViewModel с помощью отражения, у родителей нет свойств get / set, соответствующих именам полей / индексаторам / ... эквивалентного класса / коллекции конфигурации. Хотя каждый экземпляр ViewModel знает имя поля / свойства структуры данных родительской модели, из которой он был создан, и также знает свой родительский экземпляр ViewModel (но не его родительский экземпляр Model).
Каждая попытка решить эту проблему с помощью команд или вызова функции обновления какого-либо родителя завязала мне мозг.
Разве нет простого способа добиться этого с помощью обычных методов привязки?
Было бы лучше, если бы я создал ViewModels для каждого класса конфигурации (под), который я использую?
Подсказка: каждый экземпляр ViewModel знает имя своего поля / свойства в структуре данных родительской модели.