在MVVM Cross ViewModel之间传递简单参数

时间:2014-07-03 07:20:06

标签: c# mvvm viewmodel mvvmcross

发布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,因为它不知道它应该是什么样的。

1 个答案:

答案 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