Мы всегда используем Ninject, который, кажется, делает то, что вам нужно по умолчанию: -
Сначала добавьте ссылку на пакет Nuget для Ninject
Затем добавьтекласс ViewModelLocator
для вашего проекта и используйте код, подобный следующему ...
public class ViewModelLocator {
public IKernel Kernel { get; set; }
public ViewModelLocator() {
Kernel = new StandardKernel();
}
public MainWindowViewModel MainWindowViewModel =>
Kernel.Get<MainWindowViewModel>();
public ProductDetailsWindowViewModel ProductDetailsWindowViewModel =>
Kernel.Get<ProductDetailsWindowViewModel>();
}
Добавьте статический ресурс для локатора в App.xaml следующим образом ...
<Application.Resources>
<viewModels:ViewModelLocator x:Key="Locator" />
</Application.Resources>
Убедитесь, что ваши модели представления наследуются от ViewModelBase
...
public class ProductDetailsWindowViewModel : ViewModelBase
// ...
Тогда ваш DataContext
должен работать так, как вы хотите.Каждое окно получит свой экземпляр класса.
Одна вещь, которую вы должны убедиться в этом, - это убирать за собой, в противном случае вы получите множество моделей с призрачным видом.В событии Unloading вашего окна установите DataContext
в null ...
private void Window_Closing(object sender, CancelEventArgs e) {
DataContext = null;
}