MvvmCross:ShowViewModel是否总是构造新实例?

MvvmCross:ShowViewModel是否总是构造新实例?,mvvm,xamarin.ios,windows-phone,xamarin,mvvmcross,Mvvm,Xamarin.ios,Windows Phone,Xamarin,Mvvmcross,无论何时调用ShowViewModel,都会以某种方式检索ViewModel和请求类型的视图,并将其绑定在一起以显示在屏幕上。什么时候创建ViewModel和View的新实例,而不是从某个缓存中查找和检索?如果总是创建新实例,并且我选择创建自己的缓存以防止多个实例,那么如何显示缓存的ViewModel实例 什么时候创建ViewModel和View的新实例,而不是从某个缓存中查找和检索 从不-对于新导航,默认行为始终是创建新实例 如果。。。如何显示缓存的ViewModel实例 如果出于任何原因,您

无论何时调用ShowViewModel,都会以某种方式检索ViewModel和请求类型的视图,并将其绑定在一起以显示在屏幕上。什么时候创建ViewModel和View的新实例,而不是从某个缓存中查找和检索?如果总是创建新实例,并且我选择创建自己的缓存以防止多个实例,那么如何显示缓存的ViewModel实例

什么时候创建ViewModel和View的新实例,而不是从某个缓存中查找和检索

从不-对于新导航,默认行为始终是创建新实例

如果。。。如何显示缓存的ViewModel实例

如果出于任何原因,您希望覆盖ViewModel位置/创建,则在您的
App.cs
中提供了有关覆盖DefaultViewModelLocator的信息:

简单地说,实现您的代码:

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


请注意,像这样的旧帖子在概念上仍然兼容,但这些旧帖子中的详细信息现在已经过时了。

在MvvmCross v3.5中,您可以使用以下类:

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);
}}
创建一个接口“iCachableViewModel”,并在ViewModel上实现它


现在,您可以使用多个视图共享同一个ViewModel实例。

请注意,根据我使用WP8设备和
MvvmCross v3
的经验,每个导航(新的或非新的)都会为ViewModel生成新的
ctor
。我用
N-05-MultiPage
教程代码确认了相同的行为。有关更多信息,请参阅SO问题。
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);
}}
protected override IMvxViewModelLocator CreateDefaultViewModelLocator(){
return new CacheableViewModelLocator();}