MVVMLight UserControl View Model - создание нового экземпляра пользовательского элемента управления для каждого представления - PullRequest
1 голос
/ 20 февраля 2012

У меня есть пользовательский контроль над списком пациентов, который я использую в других представлениях. Однако, когда я выбираю одного из пациентов, выбор распространяется на все представления, содержащие экземпляр пользовательского элемента управления. Как сделать так, чтобы каждое представление создавало новый экземпляр пользовательского элемента управления для каждого представления? Я использую c #

1 Ответ

3 голосов
/ 20 февраля 2012

Исходя из того, что вы заявили, я предполагаю, что вы возвращаете статический экземпляр вашей PatientViewModel из вашего локатора. Чтобы решить эту проблему, убедитесь, что при вызове свойства создается новый экземпляр модели представления.

Редактировать: локатор с различными методами создания экземпляров

public class ViewModelLocator
{
    public ViewModelLocator()
    {
        ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);

            //if (ViewModelBase.IsInDesignModeStatic)
            //{
            //    // Create design time view services and models
            //    SimpleIoc.Default.Register<IDataService, DesignDataService>();
            //}
            //else
            //{
            //    // Create run time view services and models
            //    SimpleIoc.Default.Register<IDataService, DataService>();
            //}

        SimpleIoc.Default.Register<MainViewModel>();
    }

    public MainViewModel Main
    {
        get
        {
            return ServiceLocator.Current.GetInstance<MainViewModel>();
        }
    }

      public MainViewModel StaticMain
      {
          get
          {
              return _staticMain ?? (_staticMain = new MainViewModel());
          }
      }
      private static MainViewModel _staticMain;


      public MainViewModel NewMain
      {
          get
          {
              return new MainViewModel();
          }
      }

      public MainViewModel NewIocMain
      {
          get
          {
              return ServiceLocator.Current.GetInstance<MainViewModel>(Guid.NewGuid().ToString());
          }
      } 

    public static void Cleanup()
    {
        // TODO Clear the ViewModels
    }
}
  1. Свойство Main использует контейнер SimpleIoc Lauent для создания экземпляра. Одним из свойств этого контейнера является то, что он рассматривает каждый тип как синглтон. Таким образом, если вы используете этот метод генерации виртуальных машин, вы будете использовать виртуальную машину во всех представлениях.

  2. Свойство StaticMain делает то же самое, но вместо использования контейнера Лорана оно содержит статический экземпляр виртуальной машины, который также разделяется между представлениями.

  3. Свойство NewMain создает новую ВМ при каждом вызове, поэтому ВМ не разделяется между представлениями.

  4. Свойство NewIocMain также создает новую ВМ при каждом вызове, и, следовательно, ВМ не разделяется между представлениями. Однако контейнер SimpleIoc содержит ссылку на созданный экземпляр. Он не освобождает этот экземпляр автоматически, и вам нужно вызвать SimpleIoc.Default.Unregister(key) с ключом, который вы использовали для создания (Guid), чтобы удалить экземпляр из контейнера, когда он вам больше не нужен.

Вместо использования SimpleIoc вы, очевидно, можете выбрать другой контейнер IOC - например, Unity - который позволяет вам лучше контролировать, как создаются ваши экземпляры и как долго они живут. За исключением этого, я бы выбрал подход NewMain, указанный в вашем случае.

...