发布this question后。我试图实现描述here的基本视图模型。但是,我似乎仍然遇到了问题。我现在已经将基本视图模型缩小到我能想到的最简单的形式:
public BaseViewModel()
{
Mvx.RegisterType<IMvxJsonConverter, MvxJsonConverter>();
}
protected void ShowViewModel<TViewModel>(object parameter) where TViewModel : IMvxViewModel
{
//var text = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(parameter);
text = "123";
base.ShowViewModel<TViewModel>(text);
}
public void Init(string parameter)
{
if (parameter == null || parameter.Length == 0) return;
//IMvxJsonConverter converter = Mvx.Resolve<IMvxJsonConverter>();
//NavigationParameter deserialized = converter.DeserializeObject<NavigationParameter>(parameter);
//RealInit(deserialized);
}
Init语句第一行的断点显示没有传入任何内容。但是,如果我覆盖InitFromBundle
方法,我会得到一个字典,它给出了正确的对象长度。
显然,我遗漏了一些关于传递参数的基本信息,但我不知道是什么。
编辑:
我当然错过了原帖中我的问题的基本内容。我得到这个版本的ShowViewModel方法的原因是,当按照链接帖子的建议实现时,我在尝试读取值时遇到错误:
protected override void RealInit(NavigationParameter parameter)
{
_myParam = (MyParam)parameter.ObjectList["MyParam"];
_myService = (IMyService)parameter.ObjectList["MyService"];
}
错误:
Unable to cast object of type 'Newtonsoft.Json.Linq.JObject' to type 'MyApp.PCL.Models.MyModel'.
编辑:
发现问题。
NavigationParameter
看起来像这样:
public class NavigationParameter
{
public Dictionary<string, object> ObjectList { get; set; }
}
我的想法是创建一个非常通用的参数类,但当然JSON.NET不能反序列化为object
,因为它不知道它应该是什么样的。
答案 0 :(得分:2)
尝试使用您链接的问题中的ShowViewModel
方法:
protected void ShowViewModel<TViewModel>(object parameter)
where TViewModel : IMvxViewModel
{
var text = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(parameter);
base.ShowViewModel<TViewModel>(new Dictionary<string, string>()
{
{ParameterName, text}
});
}
来自Passing complex navigation parameters with MvvmCross ShowViewModel