Я использую AvalonEdit для отображения форматированного текста. Приложение написано в архитектуре MVVM на C # / WPF.
Проблема в том, что элемент управления AvalonEdit содержит много логики, которая доступна только из самого элемента управления. Итак, скажем, я хочу иметь дело с текущим выбором - для этого я должен достичь editor.TextArea.Selection
- это не доступно из модели представления.
Теперь моя архитектура может быть кратко описана как:
- Модель основного вида содержит список
DocumentViewModel
s
DocumentViewModel
содержит TextDocument
- Список
DocumentViewModel
s привязан к DockingManager
для отображения в виде списка вкладок
DockingManager
настроен на мой элемент управления, содержащий TextEditor
TextDocument
с DocumentViewModel
привязано к Document
свойству TextEditor
Скажите, что я хочу получить доступ к выделенному тексту из модели представления главного окна. Я могу получить DocumentViewModel
текущего активного документа, но у меня нет возможности получить доступ к элементу управления, который представляет его (он создан и управляется с помощью механизмов DataTemplate DockingManager
)
Обычно я решал такую проблему, передавая view в viewmodel через интерфейс - так, чтобы viewmodel мог попросить view (косвенно) сделать что-то, что я не мог связать или передать через команды. Но поскольку я не контролирую создание видов документов, я не могу использовать такое решение.
Как я могу получить доступ к TextEditor из MainWindowViewModel, имеющего только DocumentViewModel? И как это сделать, не ломая модель MVVM? (очевидно, я могу попытаться получить контроль через визуальное дерево, но это взлом, и я определенно хочу избежать этого)