2016-05-12 3 views
0

В моем приложении UWP я использую MVVM Light и его ViewModelLocator для получения ViewModels.Правильный способ получения уникальных ViewModels из MVVM Light ViewModelLocator

My ViewModelLocator выглядит так, im передавая руководство GetInstance для получения уникальной виртуальной машины.

public class ViewModelLocator 
    { 
     static ViewModelLocator() 
     { 
      ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 
      SimpleIoc.Default.Register<MyViewModel>(); 
     } 
     public MyViewModel MyVM => ServiceLocator.Current.GetInstance<MyViewModel>(Guid.NewGuid().ToString()); 
    } 

У меня есть usercontrol, который должен иметь уникальную виртуальную машину, так как я могу иметь несколько экземпляров этого пользовательского элемента управления в своем приложении. Вот как им получить ViewModel:

<UserControl x:Class="My.App.Controls" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      DataContext="{Binding Path=MyVM, Source={StaticResource ViewModelLocator}}"> 
      ... 
</UserControl> 

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

UPDATE

Таким образом, кажется, что мой код работает нормально, я получаю уникальный экземпляр MyVM каждый раз.

Теперь вопрос в том, что является правильным способом для незарегистрированной/удаленной модели.

Я могу сделать это с помощью SimpleIoc.Default.Unregister(guid), но с моей текущей реализацией он не очень прямой для доставки Guid (который использовался при создании виртуальной машины) для моего пользовательского элемента управления, поэтому я могу отменить регистрацию виртуальной машины.

В целом, если я просто создаю свою VM runtime im ViewModelLocator без SimpleIoc, есть ли другие недостатки, чем потерять зависимость?

public class ViewModelLocator 
    { 
     public MyViewModel MyVM => new MyViewModel(); 
    } 
+0

Похоже, что вы должны использовать привязку данных, а не ViewModelLocator. – BoltClock

+0

Можете ли вы привести несколько примеров? – devha

+0

http://stackoverflow.com/questions/9362332/mvvmlight-usercontrol-view-model-create-new-instance-of-user-control-for-each-vi. Обратите внимание на №4 в ответе. если вы хотите очистить viewmodels в контейнере IOC, отмените регистрацию их OnNavigatedFrom, если это имеет смысл для ваших требований. –

ответ

0

Я предполагаю, что ваш UserControl должен использоваться некоторым представлением (окном).

ViewModel, управляющий этим представлением, может порождать необходимые ViewModels для UserControl. Вы можете привязать UserControl к этому свойству «SubViewModel» и также избавиться от них, однако тогда вы пожелаете.

Смежные вопросы