Ale*_*akh 15 navigation serialization viewmodel complextype mvvmcross
即使配置了此处指定的MvxJsonNavigationSerializer,我的复杂类型也不会从Show传递给Init方法v3中导航参数中的自定义类型
public class A
{
public string String1 {get;set;}
public string String2 {get;set;}
public B ComplexObject1 {get;set;}
}
public class B
{
public double Double1 {get;set;}
public double Double2 {get;set;}
}
Run Code Online (Sandbox Code Playgroud)
当我将对象A的实例传递给ShowViewModel方法时,我收到此对象,String1&String2正确反序列化,但CopmlexObject1为null.
如何处理复杂对象MvvmCross序列化?
Stu*_*art 26
我相信在之前的回答中可能会有一些小问题 - 将记录为一个问题:/
还有其他可能的路由来实现这种类型的复杂可序列化对象导航仍然使用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}
});
}
}
Run Code Online (Sandbox Code Playgroud)
反序列化如:
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);
}
Run Code Online (Sandbox Code Playgroud)
然后像这样的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);
});
}
}
}
Run Code Online (Sandbox Code Playgroud)
可以导航到类似的东西:
public class SecondViewModel
: BaseViewModel<A>
{
public A A { get; set; }
protected override void RealInit(A parameter)
{
A = parameter;
}
}
Run Code Online (Sandbox Code Playgroud)
red*_*t84 10
斯图亚特补充类型安全的一个小补充:
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);
}
Run Code Online (Sandbox Code Playgroud)
ShowViewModel方法现在采用与RealInit方法而不是类型相同的参数object类型.此外,BaseViewModel<TInit>继承自BaseViewModel其实例也可以调用新ShowViewModel方法.
唯一的缺点是你必须在调用中显式指定参数类型,如下所示:
ShowViewModel<StoreInfoViewModel, Store>(store);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8760 次 |
| 最近记录: |