我正在使用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;有一些无效的论点。
有人可以帮我解决这个问题,有人可以建议是否有更合适的方法来实现我想要实现的目标(为此命令添加更多任务)。
答案 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
无论如何都接受了对象,所以你不必担心这一点。