В моем приложении 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();
}
Похоже, что вы должны использовать привязку данных, а не ViewModelLocator. – BoltClock
Можете ли вы привести несколько примеров? – devha
http://stackoverflow.com/questions/9362332/mvvmlight-usercontrol-view-model-create-new-instance-of-user-control-for-each-vi. Обратите внимание на №4 в ответе. если вы хотите очистить viewmodels в контейнере IOC, отмените регистрацию их OnNavigatedFrom, если это имеет смысл для ваших требований. –