c# - 如何将字符串和 int 都发送到 ICommand?
问题描述
我有一个看起来像这样的 ViewModel 命令:
// Category Page
private ICommand openPageCmd;
public ICommand OpenPageCmd =>
openPageCmd ??
(openPageCmd = new Command<string>((pageType) => settingsPage.OpenPage(pageType)));
但是,我不想发送一个字符串,而是发送一个 int 的 ID 和一个字符串的 Name。有人能告诉我我该怎么做吗?
解决方案
您可以通过实现来创建自己的命令ICommand
。创建一个具有所需参数的构造函数的命令。
看:
public class MyCommand : ICommand
{
private int _id;
private string _name;
public MyCommand(int id, string name)
{
_id = id;
_name = name;
}
public bool CanExecute(object parameter) => true;
public void Execute(object parameter)
{
//TODO: Add your implementation
}
public event EventHandler CanExecuteChanged;
}
或者更好的是,创建您自己的中继命令(通用可重用命令):
public class RelayCommand<T> : ICommand
{
private readonly T _argument;
private readonly Action<T> _execute;
public RelayCommand(T argument, Action<T> execute)
{
_execute = execute;
_argument = argument;
}
public bool CanExecute(object parameter) => true;
public void Execute(object parameter)
{
_execute(_argument);
}
public event EventHandler CanExecuteChanged;
}
视图模型
public class MyViewModel
{
private SettingsPage settingsPage = new ...;
public int Id { get; set; }
public string Name { get; set; }
public MyViewModel()
{
OpenPageCmd =
new RelayCommand<MyViewModel>(this, vm => settingsPage.OpenPage(vm.Id, vm.Name));
}
public ICommand OpenPageCmd { get; }
}
这允许命令随时使用视图模型的当前值。
推荐阅读
- postgresql - 时区从冬季更改为夏季 rails 根据新时区显示时间戳
- php - 如何从相关表中获取所有行,包括数据透视表中的列?
- jakarta-ee - 服务器崩溃和重启时的 CDI 事件观察器处理
- javascript - 使这个 dob 计算器工作的步骤是什么?JavaScript
- ef-core-2.1 - abp.io 项目模板中的多个 DbContext
- here-api - 如何为我的 getroute 请求获取 RouteId?
- java - 为什么在简单的现实生活中需要在 java 中重载?
- angular - ag-grid 渲染导致从事件启动的服务组件未定义
- javascript - 在 Object.keys 映射不起作用后设置状态
- javascript - 在谷歌的js中出现错误未定义