Блок Глена (см. Выше) упоминает, что общий подход заключается в разработке вашего MVVM решения для использования DataContext в качестве места, где вы можете "разрешить" вашу модель представления в Посмотреть. Затем вы можете использовать расширения дизайна из выражения blend 2008 (обратите внимание, что вам не нужно использовать инструменты дизайна blend выражения, чтобы воспользоваться этим). Например:
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance Type=local:MyViewModelMock, IsDesignTimeCreatable=True}"
По вашему мнению, вы можете получить средство получения свойства, которое преобразует ваш DataContext в ожидаемый вами тип (просто для упрощения его использования в коде позади).
private IMyViewModel ViewModel { get { return (IMyViewModel) DataContext; } }
Не забудьте использовать интерфейс , чтобы облегчить тестирование ваших представлений или помочь внедрить различные реализации во время выполнения.
В общем, вы не должны разрешать вещи из контейнера повсюду в вашем решении. На самом деле считается плохой практикой передавать свой контейнер в каждом конструкторе или делать его глобально доступным. (Вам следует поискать обсуждения того, почему стратегии «Service Locator» составляют «Anti-Pattern»).
Создание открытого конструктора View с явными зависимостями, которые может разрешать контейнер (например, Prism Unity или MEF).
При необходимости вы также можете создать внутренний конструктор по умолчанию для , чтобы создать макет вашей модели представления (или реальный в этом отношении). Это защищает от непреднамеренного использования этого « конструктора дизайна » извне (в вашей «Оболочке» или где-либо еще). Ваши тестовые проекты также могут использовать такие конструкторы, используя " InternalsVisibleToAttribute " в " AssemblyInfo ". Но, конечно, в этом обычно нет необходимости, поскольку вы все равно можете вводить свои макеты, используя конструкторы полной зависимости, и потому что большинство ваших тестов должны быть сосредоточены на ViewModel . Любой код в View в идеале должен быть достаточно тривиальным. (Если ваш View требует много испытаний, то вы можете спросить себя, почему!)
Глен также упоминает, что вы можете добавить видов в модели видов или видов моделей в виды . Я предпочитаю последнее, потому что есть совершенно хорошие методы для разделения всего (использование декларативного связывания, командования, агрегации событий, шаблонов посредника и т. Д.). Модель View - это то место, где будут сделаны все тяжелые работы для организации основной бизнес-логики. Если View Model предоставляет все необходимые «связующие» точки, ему действительно не нужно знать ANYTHING о View (которое может в основном быть декларативно подключенным к нему в XAML).
Если мы сделаем модель представления независимой от источника взаимодействия с пользователем, это значительно упростит тестирование (желательно сначала). И это также означает, что вы можете легко подключить ЛЮБОЕ представление (WPF, Silverlight, ASP.NET, Console и т. Д.). Фактически, чтобы гарантировать, что надлежащее разделение было достигнуто, мы можем спросить себя, может ли архитектура «MVM» (Model-ViewModel) работать в контексте, скажем, службы Workflow. Когда вы перестанете думать об этом, большинство ваших модульных тестов, вероятно, будут рассчитаны именно на эту предпосылку.