Чтобы добиться полной развязки, установите ViewModels на ResourceDictionary
, найденный в основном классе приложения.Есть два способа сделать это, и по большей части не имеет значения, какой метод используется.Однако есть и компромиссы.
Метод 1
Если это делается программно, вы должны убедиться, что ключи словаря совпадают.Это вызывает слабую связь между строками, определенными в XAML, и теми, которые определены программно.Не идеал, но и не конец света.Преимущество здесь в том, что можно использовать конструктор инъекций.
//App.xaml.cs
//This line invoked somewhere after App OnStartUp function is called.
MainViewModel mainViewModel = new MainViewModel( new Dependency() );
Current.ResourceDictionary["MainViewModel"] = mainViewModel;
//MainView.xaml
<Window DataContext="{StaticResource MainViewModel}">
Бизнес-логике не важно, что такое View, и приложение может быть загружено любым способом ... с использованием объекта фабрики / компоновщика или любого контейнера IOC.(Пока все начинается в функции OnStartUp).
Метод 2
Определение моделей представления в App.xaml
с использованием Application.Resource
.Используя этот метод, все имена ключей будут расположены в XAML, что выглядит довольно неплохо.Единственным отрицательным результатом является то, что .NET автоматически создает ViewModels, заставляя их предоставлять конструкторы по умолчанию.Иногда желательно, чтобы контейнер IOC создавал ваши объекты или использовал Constructor Injection на пользовательских фабриках / сборщиках.
//App.xaml
<Application
xmlns:local="clr-namespace:ViewModels" />
<Application.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary>
<local:MainViewModel x:key="MainViewModel" />
</ResourceDictionary>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Application.Resources>
//App.xaml.cs
MainViewModel mainViewModel = Current.ResourceDictionary["MainViewModel"];
mainViewModel.propertyInjection = new Dependency();
//MainView.xaml
<Window DataContext="{StaticResource MainViewModel}">
Оба способа являются допустимыми параметрами, и с небольшим управлением ключами можно смешивать и сопоставлятьиспользоваться в соответствии с требованиями.