以编程方式提出命令

Jef*_*fim 24 wpf command

我有一个按钮:

<Button x:Name="MyButton" Command="SomeCommand"/>
Run Code Online (Sandbox Code Playgroud)

有没有办法从源执行命令?调用按钮上的单击没有帮助:

MyButton.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
Run Code Online (Sandbox Code Playgroud)

我的意思是 - 这确实引发了事件,但它没有提高命令.有什么类似于此RaiseEvent但只是为了命令?如果没有 - 我怎样才能实例化ExecutedRoutedEventArgs?可能吗?

最后 - 请不要告诉我如何avoid调用命令.

HCL*_*HCL 46

不确定你的意思是:

if(MyButton.Command != null){
    MyButton.Command.Execute(null);
}
Run Code Online (Sandbox Code Playgroud)

c#6及更高版本(由eirik提出)有简短形式:

Mybutton.Command?.Execute(null);
Run Code Online (Sandbox Code Playgroud)

更新
正如@Benjol所建议的那样,CommandParameter在某些情况下可能需要提供按钮的-property值,而不是添加它null可以被视为默认模式:

Mybutton.Command?.Execute(MyButton.CommandParameter);
Run Code Online (Sandbox Code Playgroud)


Dom*_*nic 9

或者,如果您无权访问UI元素,则可以直接调用静态命令.例如,我有一个系统范围的键挂钩App.xaml,想要调用我的播放/暂停/停止等媒体事件:

CustomCommands.PlaybackPlayPause.Execute(null, null);
Run Code Online (Sandbox Code Playgroud)

将第二个参数传递为null将调用所有附加元素.


Blu*_*ode 7

你需要ICommand.Execute(object)做到这一点.

示例代码的工作示例: this.MyButton.Command.Execute(null);


Eri*_*let 6

我喜欢这样做的方法是按照Sean Sexton的推荐,以编程方式执行命令

简而言之,找到命令,检查它是否可以执行,如果可以,执行.

例:

    if (ApplicationCommands.Open.CanExecute(null, null))
        ApplicationCommands.Open.Execute(null, null);
Run Code Online (Sandbox Code Playgroud)

为什么我认为它更好: 我认为这是最好的方法,因为它将真正使用正确的路径而你不依赖于命名任何控件.此外,虽然您现在知道不使用"CanExecute",但您永远不知道某人将来何时会为其添加行为.