2

在 WPF 中,自定义命令有 command_Executed 和 command_CanExecute 等事件处理程序,最好的做法是实现逻辑不应该直接在代码隐藏类中实现,它应该只包含对更高级别实现逻辑的函数调用。

在制作自定义命令的时候,如果命令的handler functions中只有一个函数调用,直接放在code-behind里面很简单,但是如果有多个函数调用,或者函数调用在基础上返回一些东西怎么办其中要做出决定(特别是在禁用/启用命令的 command_CanExecute 函数的情况下,必须决定何时启用或禁用命令)。我一直在考虑的可能性如下,哪一个在可维护性、保持代码清洁、软件工程原则和最佳实践方面最合适?

  1. 将所有函数调用和决策语句保留在代码隐藏中(在 command_execute 或 command_execute 调用的代码隐藏中的某个函数中)。如果代码很简单,那很好,但是当后面的代码中有很多处理程序时,事情就会变得丑陋。这里没有实现代码,只有我之前提到的决策代码。

  2. 将实现逻辑保留在定义命令并使其可通过静态属性访问的类中。现在,代码隐藏中的处理程序将只有 1 个函数调用,并且如果需要,将接收返回值。

  3. 在实现应用程序实际功能的更高级别的类中实现它,以便代码隐藏处理程序只有一个函数调用。这是最有意义的,但这个选项在我心中产生了疑问,因为在某些情况下,命令处理程序可能必须调用许多不同的不相关类的方法,因此很难决定该逻辑的放置位置。

  4. 我错过的任何其他内容。

4

1 回答 1

4

通常我在(或者如果你不使用 MVVM 的话,在代码隐藏中)使用RelayCommandDelegateCommandViewModel

private ICommand _customCommand;

public ICommand CustomCommand
{
    get
    {
        if (_customCommand == null)
        {
            _customCommand = new RelayCommand(
                CustomCommandHandler, CanCustomCommandExecute);
        }
        return _customCommand;
    }
}

private void CustomCommandHandler()
{
    // Execute Command
}

private bool CanCustomCommandExecute()
{
    // Return true/false if the command can execute or not
}

XAML:

<Button Command="{Binding CustomCommand}" />
于 2011-10-17T20:12:53.043 回答