Как бороться со слишком логически упакованными элементами управления в MVVM / WPF? - PullRequest
0 голосов
/ 29 мая 2019

Я использую AvalonEdit для отображения форматированного текста. Приложение написано в архитектуре MVVM на C # / WPF.

Проблема в том, что элемент управления AvalonEdit содержит много логики, которая доступна только из самого элемента управления. Итак, скажем, я хочу иметь дело с текущим выбором - для этого я должен достичь editor.TextArea.Selection - это не доступно из модели представления.

Теперь моя архитектура может быть кратко описана как:

  • Модель основного вида содержит список DocumentViewModel s
  • DocumentViewModel содержит TextDocument
  • Список DocumentViewModel s привязан к DockingManager для отображения в виде списка вкладок
  • DockingManager настроен на мой элемент управления, содержащий TextEditor
  • TextDocument с DocumentViewModel привязано к Document свойству TextEditor

Скажите, что я хочу получить доступ к выделенному тексту из модели представления главного окна. Я могу получить DocumentViewModel текущего активного документа, но у меня нет возможности получить доступ к элементу управления, который представляет его (он создан и управляется с помощью механизмов DataTemplate DockingManager)

Architecture diagram

Обычно я решал такую ​​проблему, передавая view в viewmodel через интерфейс - так, чтобы viewmodel мог попросить view (косвенно) сделать что-то, что я не мог связать или передать через команды. Но поскольку я не контролирую создание видов документов, я не могу использовать такое решение.

Как я могу получить доступ к TextEditor из MainWindowViewModel, имеющего только DocumentViewModel? И как это сделать, не ломая модель MVVM? (очевидно, я могу попытаться получить контроль через визуальное дерево, но это взлом, и я определенно хочу избежать этого)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...