在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; }
    }
}

在ViewModel中拥有一个函数作为属性

如果您的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>的属性。您可以使用具有相同类型参数的方法来分配此属性。