命令类无法工作 - ICommand实现

编程语言 2026-07-10

我在一个使用MVVM模式的WPF项目中工作。为了清晰地分离关注点,我的项目被分成三个独立的项目/命名空间:

  • Model:包含数据类(例如class.cs)
  • ViewModel:包含 Command 实现及视图模型(例如 VMClass.csVMMainWindow.cs
  • View(主项目):引用 ViewModel 项目的XAML UI

问题描述

尽管我的 DataContext 已在XAML中正确设置,绑定也没有在输出中显示错误,但 Command 里面的逻辑从未被执行。

以下是我的代码:

// Inside ViewModel Project
public class Command : ICommand
{
    private Action<object> action;
    public Command(Action<object> action) { this.action = action; }

    public bool CanExecute(object parameter) => true;
    public event EventHandler CanExecuteChanged;

    public void Execute(object parameter)
    {
        // I suspect this is the culprit:
        if (parameter != null)
        {
            action(parameter);
        }
    }
}

在我的XAML视图标记中,我已将视图模型链接为命名空间,并像下面这样设置 DataContext

<Window.DataContext>
    <vm:VMMainWindow />
</Window.DataContext>

<Button Content="Execute" Command="{Binding ButtonCommand}" />

问题

  1. 在泛型 Command 类中进行这个 if (parameter != null) 的检查是不是一个不好的做法?
  2. 当没有提供任何 CommandParameter 时,应该如何处理?

解决方案

在通用Command类中进行这个if (parameter != null) 检查是不是一个不好的做法?

通过包含空值检查,您强制用户设置或绑定按钮的 CommandParameter 属性。依我之见,大多数命令并不使用或从任何参数中获益。因此我会认为这得不偿失。

当没有提供CommandParameter时,应该如何处理?

只需将参数对象传递给你的action委托。如果该action的实现需要参数,它会处理这样的参数,或许会有一个 Debug.Assert 来提醒开发者出现的错误。如果你不需要参数,可以在实现中忽略它。

我选择为了简单起见,使用一个不带任何参数的 Action 委托。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章