/abc\[^d][^e][^f][^g]
Это является довольно громоздким для больших слов, но работает как очарование.
Если модель представления может существовать только в сочетании с другой, я создаю сильную связь. То есть модель представления-владельца будет иметь прямую ссылку на одну или несколько моделей зависимых представлений. Если, с другой стороны, модель представления должна иметь возможность существовать с другим или без него, я использую слабосвязанный подход, при котором они общаются через шину событий.
С точки зрения использования DI с MVVM, абсолютно вы можете комбинировать два. Это так просто, как:
public class MyViewModel
{
private readonly IMyDependency _myDependency;
public MyViewModel(IMyDependency myDependency)
{
_myDependency = myDependency;
}
}
Обратите внимание, однако, что это предполагает подход к MVVM «сначала модель представления», который имеет свои недостатки.
В WPF это обычно довольно просто и на самом деле не зависит от какого-либо конкретного контейнера DI. Вы читали статью Джоша Смита о MVVM ? Он в значительной степени описывает, как настроить иерархию ViewModels.
В нем мало что входит, так это то, как создавать эти ViewModels из зависимостей (таких как репозитории), но это несложная экстраполяция.
Я часто сталкивался с тем, что либеральное использование абстрактных фабрик очень помогает в этом отношении. Вместо того, чтобы напрямую создавать ViewModels, я позволил внедренной Factory сделать это за меня.
Вы можете использовать DI для бедняков или любой другой DI-контейнер для подключения таких фабрик для вас.
Я опубликовал эту статью в Code Project о том, как создать расширяемое приложение WPF с использованием MVVM и MEF для расширяемости. Однако, если вы присмотритесь, я также использовал MEF для DI.
Приложение полностью MVVM и использует только DataTemplates (и иногда Window) для представлений, как и в статье Джоша Смита. WPF позаботится о применении правильного представления к правильной модели представления для вас. Это мило.
Он использует MEF, чтобы части могли «находить» друг друга. Таким образом, ViewModel для пункта меню «View» находит все пункты меню, которые должны находиться в подменю, используя точки расширения, а ViewModel для каждого из них «находит» ViewModel, который они должны передать менеджеру компоновки, используя составные точки. Еще они «находят» сервис менеджера компоновки с использованием элементарного локатора сервисов (MEF). Пример меню «Просмотр» - это почти то же самое, о чем вы говорите с вложенными моделями просмотра. Круто то, что они даже не знают друг о друге до выполнения.