C # MVVM TreeView TwoWay-Binding для иерархических данных - PullRequest
0 голосов
/ 15 июля 2010

Я гуглил ответ на этот вопрос уже более двух недель. Обычно это означает, что я либо слепой, либо идея абсурдна. В любом случае:

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

  • Конфигурация (сборник)
    1. Аудио (класс)
      • BaseDir (структура)
      • PlayMode (enum)
      • Вход (класс)
      • CalibrateOnConnect (bool)
      • KnownDevices (коллекция)
        1. ... (класс)
          • ...
      • UseDevice (целое число)
      • Плейлист (коллекция)
        1. 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 знает имя своего поля / свойства в структуре данных родительской модели.

1 Ответ

1 голос
/ 22 июля 2013

Читая комментарии, я бы сказал, что модель представления должна быть тесно связана с моделью, которую она пытается представить. Наличие модели динамического обзора также очень сложно проверить.

Однако, если вы действительно хотите попытаться обойти это, вы можете рассмотреть возможность использования DynamicObject , который позволяет вам получать / устанавливать свойства экземпляра в совершенно общем виде. С помощью DynamicObjects вам затем предоставляются хуки, которые вызываются, когда свойство либо устанавливается, либо получает, что позволит вам (например) вызвать события NotifyPropertyChange для данного динамического свойства.

...