2015-05-14 25 views
1

我有一個包含元素列表(可點擊的設置)的頁面,每個元素都有一個SettingViewModel關聯。 每個元素在頁面視圖模型的構造函數中設置,就像這樣:作爲ViewModel中的一個屬性的函數

AccountSettingsVMList.Add(new SettingViewModel() 
     { 
      SettingTitle = AppResources.MainApp_EditProfileSetting, 
      PageType = typeof(EditProfilePage) 
     }); 

點擊每一個元素,我觸發頁面導航:

public void SelectSetting(SettingViewModel setting) 
    { 
     Type pageType = setting.PageType; 
     if (pageType != null) 
     { 
      NavigationManager.NavigateToView(pageType); 
     } 
    } 

現在,這一切工作正常,很正常,但對於某些設置,我需要發送序列化參數。問題是我會通過執行異步的web服務調用來獲取這些參數。 我需要知道如何將一個方法指針添加爲參數視圖模型,這樣我就可以建立的設置爲:

AccountSettingsVMList.Add(new SettingViewModel() 
     { 
      SettingTitle = AppResources.MainApp_EditProfileSetting, 
      PageType = typeof(EditProfilePage), 
      Call = ProfileParams_Call 
     }); 

,然後調用朝向觀看導航之前得到的參數:

public void SelectSetting(SettingViewModel setting) 
    { 
     object obj = null; 
     if (Call != null) 
     { 
      obj = await Call(); 
     } 

     Type pageType = setting.PageType; 
     if (pageType != null) 
     { 
      NavigationManager.NavigateToView(pageType, obj); 
     } 
    } 

如何定義SettingViewModel中的屬性來實現此目的?

P.S:爲了完整起見,這是目前SettingViewModel代碼:

public class SettingViewModel : BaseViewModel 
{ 
    private string _settingTitle; 

    public string SettingTitle 
    { 
     get { return _settingTitle; } 
     set 
     { 
      _settingTitle = value; 
      NotifyPropertyChanged("SettingTitle"); 
     } 
    } 

    private Type _settingPage; 

    public Type PageType 
    { 
     get { return _settingPage; } 
     set { _settingPage = value; } 
    } 
} 

回答

1

如果您的ProfileParams_Call在每種情況下都是相同的,那麼只需使用內置委託類型Func<T>來保存返回類型T的函數。由於該調用是異步的,它將返回Task<T>

例子。如果ProfileParams_Call返回一個對象,並且不帶任何參數將是:

public Func<Task<object>> Call { get; set; } 

如果每個電話都有不同的簽名,那麼你就需要來包裝中的呼叫拉姆達或匿名委託,提供所需要的參數。

AccountSettingsVMList.Add(new SettingViewModel() 
{ 
    SettingTitle = AppResources.MainApp_EditProfileSetting, 
    PageType = typeof(EditProfilePage), 
    Call = async() => await ProfileParams_Call(someArgument); 
}); 
+0

它的工作!謝謝! – Jserra

0

也許你可以創建Action<T>類型的屬性。您可以使用具有相同類型參數的方法分配此屬性。

相關問題