我有一个包含元素列表的页面 - 可点击的设置 - 每个都有一个相关的SettingViewModel。 每个元素都在页面视图模型的构造函数中设置,如下所示:
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);
}
}
现在,这一切都很好用,但是对于某些设置,我需要发送序列化的参数。问题是我通过执行asser的webservice调用来获取这些参数。 我需要知道如何将方法指针作为参数添加到ViewModel,因此我可以将设置构建为:
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; }
}
}
答案 0 :(得分:1)
如果ProfileParams_Call
在每种情况下都相同,那么只需使用内置委托类型Func<T>
来保存返回类型T的函数。由于调用是异步的,它将返回{ {1}}。
实施例。如果Task<T>
返回一个对象,并且没有参数,那么它将是:
ProfileParams_Call
如果每个调用都有不同的签名,那么您需要将调用包装在提供所需参数的lambda或匿名委托中。
例如
public Func<Task<object>> Call { get; set; }
答案 1 :(得分:0)
您可以创建Action<T>
类型的属性。您可以使用具有相同类型参数的方法分配此属性。