C# wpf中的自定义命令

C# wpf中的自定义命令,c#,wpf,command,C#,Wpf,Command,我正在使用一个WPF应用程序,它有一个工具栏/菜单,可以使用几个自定义命令。大概15-20岁左右。我看过关于如何创建自定义命令的文档,但没有一个文档一定适用于我正在尝试的操作 我使用一个控制器来处理我的应用程序中的业务逻辑,我试图阻止我的视图执行任何逻辑 我想做的是在我的项目中创建一个包含自定义命令类的目录,这样我就可以将它们从控制器和视图中解耦,但我仍然希望从视图中调用它们,如普通命令 我也看到了DelegateCommand类的使用,但不太确定这是否是我想要的方向 我希望能够有一个任意的自定

我正在使用一个WPF应用程序,它有一个工具栏/菜单,可以使用几个自定义命令。大概15-20岁左右。我看过关于如何创建自定义命令的文档,但没有一个文档一定适用于我正在尝试的操作

我使用一个控制器来处理我的应用程序中的业务逻辑,我试图阻止我的视图执行任何逻辑

我想做的是在我的项目中创建一个包含自定义命令类的目录,这样我就可以将它们从控制器和视图中解耦,但我仍然希望从视图中调用它们,如普通命令

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

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

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

    public void Execute(object parameter)
    {

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

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

我不熟悉使用命令,所以我仍在尝试掌握这个概念

谢谢,

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


我在我的项目中都使用它,它是一个实时节省器。

概念是将命令绑定到按钮,该命令驱动该按钮的两个属性:“单击”和“启用”,从而生成您发布的界面

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

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

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();
    }
}
如果您想连接CanExecute,也可以使用第二个ctor并提供一个CanSave方法

public RelayCommand SaveCommand { get; set; }

SaveCommand = new RelayCommand(OnSave, CanSave);

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

public bool CanSave()
{
    return // ... 
}
正如您可能注意到的,我在实现中删除了命令参数。这在大多数情况下就足够了,可以在处理程序方法中保存额外的参数。对于剩下的10%,我实现了一个
RelayCommand
,它执行一个操作而不是操作,并将
Execute
方法更改为

    public void Execute(object parameter)
    {
        action((T)parameter);
    }
这需要一个参数化处理程序

SaveCommand = new RelayCommand<SomeType>(OnSave);

public void Save(SomeType toSave)
{
    // save logic using parameter
}
SaveCommand=newrelaycommand(OnSave);
公共作废保存(SomeType toSave)
{
//使用参数保存逻辑
}

这将保存您在使用
对象
变量时遇到的所有铸造问题,并确保视图模型类型安全。

我通过以下帖子回答了自己的问题,

这的确是一种非常有用的命令执行方式,特别是对于M-V-VM体系结构,但不幸的是,这并不是我想要的,如果您阅读上面的内容,我实际上是想将所有逻辑从我的观点中分离出来,我有具体的理由这样做,事实上,我在这里找到了我想要的东西——尽管如此,还是为你的伟大榜样投票吧,谢谢!即使您希望通过静态类提供命令,我也建议使用RelayCommands。这样,您就不需要为xaml文件和
\u DeleteContact=new RoutedUICommand(“删除现有联系人”、“删除联系人”、typeof(MyAppCommands)),编写任何代码隐藏代码包含硬编码字符串,这些字符串可能会更改并阻碍重构。我对您的用例感兴趣。为什么要将所有命令放在一个静态类中?
SaveCommand = new RelayCommand<SomeType>(OnSave);

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