2017-05-24 117 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。

相關問題