在 ViewModel 中具有 属性 的功能

Have a function as a property in ViewModel

我有一个页面,其中包含一个元素列表 - 可点击设置 -,每个元素都有一个关联的 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);
        }
    }

您将如何在 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; }
    }
}

也许您可以创建 属性 类型的 Action<T>。 属性 您可以使用具有相同类型参数的方法进行赋值。

如果您的 ProfileParams_Call 在每种情况下都相同,则只需使用内置委托类型 Func<T> 来保存 return 类型为 T 的函数。因为调用是异步,它将 return 一个 Task<T>.

例子。如果 ProfileParams_Call return 是一个对象,并且不带任何参数,它将是:

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