在ViewModel中将函数作为属性

时间:2015-05-14 10:18:13

标签: c# wpf windows-phone-8

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

2 个答案:

答案 0 :(得分:1)

如果ProfileParams_Call在每种情况下都相同,那么只需使用内置委托类型Func<T>来保存返回类型T的函数。由于调用是异步的,它将返回{ {1}}。

实施例。如果Task<T>返回一个对象,并且没有参数,那么它将是:

ProfileParams_Call

如果每个调用都有不同的签名,那么您需要将调用包装在提供所需参数的lambda或匿名委托中。

例如

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

答案 1 :(得分:0)

您可以创建Action<T>类型的属性。您可以使用具有相同类型参数的方法分配此属性。