使用具有多个任务的 RelayCommand 创建命令:

Creating a command using RelayCommand with multiple tasks:

我正在使用 RelayCommand(出于某种原因在我的代码中称为 CommandRelay),如 Josh Smith 的旧 MVVM 文章中所述。在我的一个工作区中,我有一个接受任何输入的文本框,当按下回车键时,文本框将被清除,一个消息框应该出现 "command evoked {0}" 其中 {0} 是文本 属性的文本框。此外,此 属性 还应添加到历史字符串中,该字符串用作同一视图中文本块的文本 属性。我已经设法使消息框正常工作,但是,由于我是 WPF 和 MVVM 的新手,我不确定如何正确地向我的命令添加更多任务。

这是相关的 XAML:

<TextBox Background="Transparent" BorderBrush="{StaticResource brushWatermarkBorder}" Name="txtUserEntry">
    <TextBox.InputBindings>
        <KeyBinding Command="{Binding BindKeyCommand}"
                    CommandParameter="{Binding ElementName=txtUserEntry, Path=Text}"
                    Key="Return"
                    Modifiers=""/>
    </TextBox.InputBindings>
</TextBox>

以及ViewModel中的相关命令:

CommandRelay _BindKeyCommand;
    public ICommand BindKeyCommand
    {
        get
        {
            _BindKeyCommand = new CommandRelay(param => MessageBox.Show(string.Format("Command invoked : {0}", param))); 
            return this._BindKeyCommand;
        }
    }

这个 returns 一个包含文本的消息框成功了。

我已经尝试了几种方法来从该命令中获取多个操作,最明显的是尝试将多个操作传递给 RelayCommand class,但这显然也行不通。然后我尝试将参数传递给单独的执行函数,如下所示:

CommandRelay _BindKeyCommand;
public ICommand BindKeyCommand
{
    get
    {
        _BindKeyCommand = new CommandRelay(param => this.ExecuteBindKeyCommand(param)); 
        return this._BindKeyCommand;
    }
}
public void ExecuteBindKeyCommand(string param)
{
    MessageBox.Show(string.Format("CommandInvoked: {0}", param));
    // MORE TASKS HERE
}

这肯定会让我用这个命令做很多事情。但是,我在这一行使用此方法时出错;

_BindKeyCommand = new CommandRelay(param => this.ExecuteBindKeyCommand(param));

The best overloaded method match for 'WPFproject.ViewModels.CLIViewModel.ExecuteBindKeyCommand(string)' has some invalid arguments.

有人可以帮我解决这个问题吗,有人可以建议是否有更合适的方法来实现我想要实现的目标(向此命令添加更多任务)。

CommandParameter 始终是 object,因此您必须将其转换为您需要的任何类型。

在您的情况下,您可以将参数转换为 string,如下所示:

new CommandRelay(param => this.ExecuteBindKeyCommand((string)param)); 

或者,更改您的方法以接受 object 参数,然后在方法中将其转换为 string 可能是更好的主意:

public void ExecuteBindKeyCommand(object param)
{
    MessageBox.Show(string.Format("CommandInvoked: {0}", param));

    // MORE TASKS HERE
}    

也就是说,string.Format 无论如何都会接受对象,因此您无需担心这一点。