Как сказать MVVMLight создать новую модель представления? - PullRequest
0 голосов
/ 11 февраля 2019

Я использую MvvmLight в проекте WPF и настроил локатор модели представления, как показано в их примерах ...

public class ViewModelLocator {
  public ViewModelLocator() {
    SimpleIoc.Default.Register<MainWindowViewModel>();
    SimpleIoc.Default.Register<ProductDetailsWindowViewModel>();
  }

  public MainWindowViewModel MainWindowViewModel =>
    SimpleIoc.Default.GetInstance<MainWindowViewModel>();
  public ProductDetailsWindowViewModel ProductDetailsWindowViewModel => 
    SimpleIoc.Default.GetInstance<ProductDetailsWindowViewModel>();
}

У меня есть следующая строка в открывающем теге моего XAML...

DataContext="{Binding Source={StaticResource Locator},
    Path=ProductDetailsWindowViewModel}"

Это работает, но локатор всегда возвращает одну и ту же модель представления, т.е. один и тот же экземпляр, что означает, что если у меня открыто более одного окна сведений о продукте, все они будут использовать одну и ту же модель представления.

Как мне сказать MvvmLight создать новую модель представления, когда я ее запрашиваю?

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Как мне сказать MvvmLight создать новую модель представления, когда я ее запрашиваю?

Использовать перегрузку метода GetInstance, который принимает string и передает уникальныйstring значение к нему:

public MainViewModel Main =>
    ServiceLocator.Current.GetInstance<MainViewModel>(System.Guid.NewGuid().ToString());
0 голосов
/ 12 февраля 2019

Мы всегда используем 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;
}
...