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