2017-05-24 63 views
0

我有一个视图模型此调用是否可以将空引用传递给Init视图模型?

ShowViewModel<MyViewModel>(
    new MyParams { ... } 
); 

在MyViewModel我有这个Init方法,它完美的作品

public void Init(MyParams params) 
{ 
    if (params != null) 
    { 
     // some logic 
    } 
    else 
    { 
     // some other logic 
    } 
} 

在另一个视图模型我有

ShowViewModel<MyViewModel>(); 

我期待在初始化方法MyViewModel上收到null,而不是我得到'MyParams'的实例。这就是产生问题,因为我有具体的逻辑不带参数

我有可能会负责这一点,但乍一看我不能确定任何自定义逻辑,负责定制主持人的逻辑来处理呼叫。这是复杂参数的标准行为吗?

回答

1

不幸的是,没有没有使用参数对象传递的方式。

原因是,当Mvx创建ViewModel并尝试调用Init方法时,它会首先将您的对象实例转换为简单字典(键/值对)。如果您使用no arg版本,则会创建一个空字典。此时,它会创建一个包含字典的MvxBundle

当MVX终于准备打电话给你Init方法,它需要这个字典并试图创建一个实际的对象。

正是这种方法创建实例传递给Init

MvxSimplePropertyDictionaryExtensionMethods.Read()

https://github.com/MvvmCross/MvvmCross/blob/8a824c797747f74716fc64c2fd0e8765c29b16ab/MvvmCross/Core/Core/Platform/MvxSimplePropertyDictionaryExtensionMethods.cs#L54-L72

public static object Read(this IDictionary<string, string> data, Type type) 
{ 
    var t = Activator.CreateInstance(type); 
    var propertyList = 
     type.GetProperties(BindingFlags.Instance | BindingFlags.Public | BindingFlags.FlattenHierarchy).Where(p => p.CanWrite); 

    foreach (var propertyInfo in propertyList) 
    { 
     string textValue; 
     if (!data.TryGetValue(propertyInfo.Name, out textValue)) 
      continue; 

     var typedValue = MvxSingletonCache.Instance.Parser.ReadValue(textValue, propertyInfo.PropertyType, 
                    propertyInfo.Name); 
     propertyInfo.SetValue(t, typedValue, new object[0]); 
    } 

    return t; 
} 

注意它是如何调用Activator.CreateInstance(type)它总是会返回一个实例。

所以这就是为什么你永远不会在Init获得null值。

我的建议是一个简单的属性添加到您的MyParams对象,并设置在无参数的版本。然后在Init您可以检查属性以确定要执行的操作。

喜欢的东西:

ShowViewModel<MyViewModel>(new MyParams { HasNoParams = true }); 

public void Init(MyParams myParams) 
{ 
    if (myParams.HasNoParams) 
    { 
     // do null flow here 
    } 
    else 
    { 
     // do non-null flow here 
    } 
} 
0

您可以使用字典< TKEY的,TValue>中为您的PARAMS。

相关问题