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