首页 > 解决方案 > 如何将字符串和 int 都发送到 ICommand?

问题描述

我有一个看起来像这样的 ViewModel 命令:

// Category Page
private ICommand openPageCmd;
public ICommand OpenPageCmd =>
    openPageCmd ??
    (openPageCmd = new Command<string>((pageType) => settingsPage.OpenPage(pageType)));

但是,我不想发送一个字符串,而是发送一个 int 的 ID 和一个字符串的 Name。有人能告诉我我该怎么做吗?

标签: c#wpf

解决方案


您可以通过实现来创建自己的命令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; }
}

这允许命令随时使用视图模型的当前值。


推荐阅读