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

时间:2015-08-20 06:58:46

标签: c# wpf xaml mvvm relaycommand

我正在使用RelayCommand(由于某种原因在我的代码中称为CommandRelay),如Josh Smith的旧MVVM文章中所述。在我的一个工作区中,我有一个文本框,它接受任何输入,当按下enter键时,文本框将被清除,一个消息框应该出现"命令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;
        }
    }

这将成功返回包含文本的消息框。

我已经尝试过几个方法来从这个命令中获取多个动作,最明显的是尝试将多个动作传递给RelayCommand类,但显然,这也没有用。所以我试图将Param传递给一个单独的Execute函数,如下所示:

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));
  

最佳重载方法匹配&#39; WPFproject.ViewModels.CLIViewModel.ExecuteBindKeyCommand(string)&#39;有一些无效的论点。

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

1 个答案:

答案 0 :(得分:1)

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无论如何都接受了对象,所以你不必担心这一点。