wpf中的自定义命令

时间:2011-03-19 14:11:17

标签: c# wpf command

我正在开发一个WPF应用程序,它有一个工具栏/菜单,可用于多个自定义命令。可能在15-20左右。我已经看过如何创建自定义命令的文档,但它们都不一定适用于我想要做的事情。

我正在使用一个控制器来处理我的应用程序中的业务逻辑,我试图让我的观点完全不做任何逻辑。

我想要做的是在我的项目中创建一个目录,该目录包含自定义命令类,以便我可以将它们与控制器和视图分离,但我仍然希望从视图中调用它们,例如正常的命令是。

我也看到过使用DelegateCommand类,但我不太确定这是否是我想要进入的方向。

我希望能够拥有一个任意的自定义命令类,如下面的

public CustomCommand: ICommandd
{
    public bool CanExecute(object parameter)
    {
        //arbitrary logic
    }

    public void Execute(object parameter)
    {

    }
}

我的想法是,我会有10-20个,我想让它们与其他所有东西分开,并在需要时调用它们。

我知道有一种方法可以分离我的自定义命令,但我不太确定。

我是使用命令的新手,所以我仍然试图掌握这个概念。

感谢,

3 个答案:

答案 0 :(得分:4)

概念是您将命令绑定到按钮,该命令驱动此按钮的两个属性:“on click”和“enabled”导致您发布的界面。

您想要执行命令的主要原因是能够将按钮单击绑定到视图模型中的操作。

如果创建一个将操作作为构造函数参数的自定义命令,则可以将视图模型中的方法直接连接到命令。

public class RelayCommand: ICommandd
{
    Action action;
    Func<bool> canExecute;

    public RelayCommand(Action action) : this(action, () => true) {}
    public RelayCommand(Action action, Func<bool> canExecute) 
    { 
        this.action = action; 
        this.canExecute = canExecute;
    }

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

    public void Execute(object parameter)
    {
        action();
    }
}

视图模型中的用法是

public RelayCommand SaveCommand { get; set; }

SaveCommand = new RelayCommand(OnSave);

public void Save()
{
    // save logic...
}

如果您想连接CanExecute,也可以使用第二个ctor并提供CanSave方法。

public RelayCommand SaveCommand { get; set; }

SaveCommand = new RelayCommand(OnSave, CanSave);

public void Save()
{
    // save logic...
}

public bool CanSave()
{
    return // ... 
}

您可能已经注意到我在我的实现中删除了command参数。这在大多数情况下就足够了,并且可以在处理程序方法中节省额外的参数。对于剩下的10%,我实施了一个RelayCommand<T>,它采用了Action而不是Action,并将Execute方法更改为

    public void Execute(object parameter)
    {
        action((T)parameter);
    }

需要参数化处理程序

SaveCommand = new RelayCommand<SomeType>(OnSave);

public void Save(SomeType toSave)
{
    // save logic using parameter
}

这可以节省您在使用object变量时遇到的所有投射问题,并保持您的视图模型类型安全。

答案 1 :(得分:1)

使用RelayCommand,它不需要为每个命令创建一个类,只需将两个方法作为lambda表达式/委托添加到构造函数中。

我在我的项目中使用它,这是一个真正节省时间。

答案 2 :(得分:0)

我最后通过以下帖子回答了我自己的问题, http://www.codeproject.com/KB/WPF/CentralizingWPFCommands.aspx?display=Print