Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 使用MvvmCross ShowViewModel传递复杂的导航参数_Serialization_Navigation_Viewmodel_Mvvmcross_Complextype - Fatal编程技术网

Serialization 使用MvvmCross ShowViewModel传递复杂的导航参数

Serialization 使用MvvmCross ShowViewModel传递复杂的导航参数,serialization,navigation,viewmodel,mvvmcross,complextype,Serialization,Navigation,Viewmodel,Mvvmcross,Complextype,即使配置了此处指定的MvxJsonNavigationSerializer,我的复杂类型也不会从Show传递到Init方法 当我将对象A的实例传递给ShowViewModel方法时,我接收到该对象,其中String1和String2已正确反序列化,但CopmlexObject1为null 如何处理复杂对象MvvmCross序列化?我相信前面的答案中可能有一些小精灵-将作为一个问题记录:/ 还有其他可能的途径来实现这种类型的复杂可序列化对象导航,仍然使用Json和覆盖框架的部分,但实际上我认为最

即使配置了此处指定的MvxJsonNavigationSerializer,我的复杂类型也不会从Show传递到Init方法

当我将对象A的实例传递给ShowViewModel方法时,我接收到该对象,其中String1和String2已正确反序列化,但CopmlexObject1为null


如何处理复杂对象MvvmCross序列化?

我相信前面的答案中可能有一些小精灵-将作为一个问题记录:/


还有其他可能的途径来实现这种类型的复杂可序列化对象导航,仍然使用Json和覆盖框架的部分,但实际上我认为最好只使用您自己的BaseViewModel来进行序列化和反序列化-例如,使用序列化代码,如:

public class BaseViewModel
    : MvxViewModel
{
    private const string ParameterName = "parameter";

    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}
            });
    }
}
公共类BaseViewModel
:MvxViewModel
{
私有常量字符串ParameterName=“parameter”;
受保护的void ShowViewModel(对象参数)
其中TViewModel:IMvxViewModel
{
var text=Mvx.Resolve().SerializeObject(参数);
base.ShowViewModel(新字典()
{
{ParameterName,text}
});
}
}
使用反序列化,如:

public abstract class BaseViewModel<TInit>
    : MvxViewModel
{
    public void Init(string parameter)
    {
        var deserialized = Mvx.Resolve<IMvxJsonConverter>().DeserializeObject<TInit>(parameter);
        RealInit(deserialized);
    }

    protected abstract void RealInit(TInit parameter);
}
公共抽象类BaseViewModel
:MvxViewModel
{
公共void Init(字符串参数)
{
var deserialized=Mvx.Resolve().DeserializeObject(参数);
RealInit(反序列化);
}
受保护的抽象void RealInit(TInit参数);
}
然后创建一个如下所示的viewModel:

public class FirstViewModel
    : BaseViewModel
{
    public IMvxCommand Go
    {
        get
        {
            return new MvxCommand(() =>
                {
                    var parameter = new A()
                        {
                            String1 = "Hello",
                            String2 = "World",
                            ComplexObject = new B()
                                {
                                    Double1 = 42.0,
                                    Double2 = -1
                                }
                        };
                    ShowViewModel<SecondViewModel>(parameter);
                });
        }
    }
}
ShowViewModel<StoreInfoViewModel, Store>(store);
公共类FirstViewModel
:BaseViewModel
{
公共imvxgo命令
{
得到
{
返回新的MvxCommand(()=>
{
var参数=新的A()
{
String1=“你好”,
String2=“世界”,
ComplexObject=new B()
{
双1=42.0,
Double2=-1
}
};
ShowViewModel(参数);
});
}
}
}
可以导航到以下内容:

public class SecondViewModel
    : BaseViewModel<A>
{
    public A A { get; set; }

    protected override void RealInit(A parameter)
    {
        A = parameter;
    }
}
公共类SecondViewModel
:BaseViewModel
{
公共A{get;set;}
受保护的重写void RealInit(一个参数)
{
A=参数;
}
}

斯图尔特的答案中增加了一点类型安全性:

public class BaseViewModel: MvxViewModel {

    protected bool ShowViewModel<TViewModel, TInit>(TInit parameter) where TViewModel: BaseViewModel<TInit> {
        var text = Mvx.Resolve<IMvxJsonConverter>().SerializeObject(parameter);
        return base.ShowViewModel<TViewModel>(new Dictionary<string, string> { {"parameter", text} });
    }
}

public abstract class BaseViewModel<TInit> : BaseViewModel {

    public void Init(string parameter)
    {
        var deserialized = Mvx.Resolve<IMvxJsonConverter>().DeserializeObject<TInit>(parameter);
        RealInit(deserialized);
    }

    protected abstract void RealInit(TInit parameter);
}

非常感谢。这是一种有趣的方法,而且肯定会奏效,因为我完全可以自己控制序列化/反序列化过程。通过在uiview项目中添加mvvmcross json插件,我能够解决这个问题。
ShowViewModel<StoreInfoViewModel, Store>(store);