如何在WPF中绑定命令

Meg*_*ind 13 c# wpf commandbinding icommand

有时我们使用复杂的方法很多次,我们忘记了完成任务的最简单方法.

我知道如何进行命令绑定,但我总是使用相同的方法.

创建一个实现ICommand接口的类,并从视图模型中创建该类的新实例,绑定就像一个魅力.

这是我用于命令绑定的代码

 public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;            
        testCommand = new MeCommand(processor);
    }

    ICommand testCommand;

    public ICommand test
    {
        get { return testCommand; }
    }
    public void processor()
    {
        MessageBox.Show("hello world");
    }
}

public class MeCommand : ICommand
{
    public delegate void ExecuteMethod();
    private ExecuteMethod meth;
    public MeCommand(ExecuteMethod exec)
    {
        meth = exec;
    }

    public bool CanExecute(object parameter)
    {
        return false;
    }

    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        meth();
    }
}
Run Code Online (Sandbox Code Playgroud)

但我想知道这样做的基本方法,没有第三方dll没有新的类创建.使用单个类执行此简单命令绑定.实际的类从ICommand接口实现并完成工作.

aif*_*rfa 15

Prism已经提供了Microsoft.Practices.Prism.Commands.DelegateCommand

我不确定它是否被视为第三方.至少它是官方的,并在MSDN上记录.

一些本机内置命令如copy,paste实现ICommand接口.恕我直言打开(扩展)/关闭(改变)原则.这样我们就可以实现自己的命令.


更新

正如WPF命令在此记录,摘录......

WPF提供了一组预定义的命令.例如Cut,BrowseBack和BrowseForward,Play,Stop和Pause.

如果命令库类中的命令不满足您的需要,则可以创建自己的命令.有两种方法可以创建自定义命令.第一个是从头开始实现ICommand接口.另一种方式,更常见的方法是创建RoutedCommandRoutedUICommand.

我在开始时尝试过RoutedCommand模型,最终实现了ICommand.

示例XAML绑定

<CommandBinding Command="{x:Static custom:Window1.CustomRoutedCommand}"
                    Executed="ExecutedCustomCommand"
                    CanExecute="CanExecuteCustomCommand" />
Run Code Online (Sandbox Code Playgroud)

RoutedCommand与RoutedEvent没有什么不同.这似乎是一个更好的按钮'Clicked'事件处理程序.它的目的是:将应用程序逻辑与View分开但需要一些附加DependencyProperty或代码隐藏.

我个人觉得只需要实现我的ICommand就更舒服了.

  • 实际上是否检查了DelegateCommand?最小的实现看起来像[this](http://wpftutorial.net/DelegateCommand.html).在你的ViewModel类中编写`public ICommand Save {get {return new DelegateCommand(new Action <object>((t)=> {ViewModelMethodSave();})); 对我来说这看起来很简单. (2认同)