在ViewModel中拥有一个函数作为属性
本文关键字:属性 函数 有一个 ViewModel 拥有 | 更新日期: 2023-09-27 17:49:14
我有一个包含元素列表的页面-可单击的设置-每个元素都有一个关联的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);
}
}
现在,这一切都工作得很好,但对于某些设置,我需要发送序列化的参数。问题是,我将通过执行web服务调用来获取这些参数,这是异步的。我需要知道如何将方法指针作为参数添加到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);
}
}
如何在setingviewmodel中定义属性来实现这一点?
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; }
}
}
如果您的ProfileParams_Call
在每种情况下都是相同的,那么只需使用内置的委托类型Func<T>
来保存返回类型t的函数。由于调用是异步的,它将返回Task<T>
。
的例子。如果ProfileParams_Call
返回一个对象,并且不接受参数,它将是:
public Func<Task<object>> Call { get; set; }
如果每个调用都有不同的签名,那么您需要将调用包装在一个lambda或匿名委托中,该委托提供所需的参数。
如
AccountSettingsVMList.Add(new SettingViewModel()
{
SettingTitle = AppResources.MainApp_EditProfileSetting,
PageType = typeof(EditProfilePage),
Call = async () => await ProfileParams_Call(someArgument);
});
也许您可以创建一个类型为Action<T>
的属性。您可以使用具有相同类型参数的方法来分配此属性。