MvvmCross: Does ShowViewModel always construct new instances?

前端 未结 2 564
囚心锁ツ
囚心锁ツ 2020-12-17 03:27

Whenever I call ShowViewModel, somehow a ViewModel and a View of the requested types are retrieved and are bound together for display on the screen. When are new instances

相关标签:
2条回答
  • 2020-12-17 04:00

    In MvvmCross v3.5 you can use this Class:

    public class CacheableViewModelLocator : MvxDefaultViewModelLocator{
    public override IMvxViewModel Load(Type viewModelType, IMvxBundle parameterValues, IMvxBundle savedState)
    {
        if (viewModelType.GetInterfaces().Any(x=>x == typeof(ICacheableViewModel)))
        {
            var cache = Mvx.Resolve<IMvxMultipleViewModelCache>();
            var cachedViewModel = cache.GetAndClear(viewModelType);
    
            if (cachedViewModel == null)
                cachedViewModel = base.Load(viewModelType, parameterValues, savedState);
    
            cache.Cache(cachedViewModel);
    
            return cachedViewModel;
        }
    
        return base.Load(viewModelType, parameterValues, savedState);
    }}
    

    in your App Code override this method:

    protected override IMvxViewModelLocator CreateDefaultViewModelLocator(){
    return new CacheableViewModelLocator();}
    

    Create an interface "ICacheableViewModel" and implement it on your ViewModel.

    Now you can share the same ViewModel instance with multiple Views.

    0 讨论(0)
  • 2020-12-17 04:02

    When are new instances of the ViewModel and View created versus looked up and retrieved from a cache somewhere?

    Never - for new navigations the default behaviour is always to create new instances.

    if... how do I show my cached ViewModel instance?

    If for whatever reason you want to override the ViewModel location/creation, then there's information available about overriding the DefaultViewModelLocator in your App.cs in:

    • MVVMCross Passing values to ViewModel that has 2 constructors
    • http://slodge.blogspot.co.uk/2013/01/navigating-between-viewmodels-by-more.html

    Put simply, implement your code:

    public class MyViewModelLocator
      : MvxDefaultViewModelLocator
    {
        public override bool TryLoad(Type viewModelType, IDictionary<string, string> parameterValueLookup,
                                 out IMvxViewModel model)
        {
            // your implementation
        }
    }
    

    then return it in App.cs:

    protected override IMvxViewModelLocator CreateDefaultViewModelLocator()
    {
        return new MyViewModelLocator();
    }
    

    Note that older posts like How to replace MvxDefaultViewModelLocator in MVVMCross application are still conceptually compatible - but the details in those older posts are now out of date.

    0 讨论(0)
提交回复
热议问题