放置自定义WPF命令(routeduiccommand)处理程序实现代码的最佳位置



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

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

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

  2. 将实现逻辑保留在定义命令的类中,并使其可以通过静态属性访问。现在,代码后面的处理程序将只有一个函数调用,如果必须的话,它将接收返回值。

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

  4. 还有我错过的吗

通常我使用RelayCommand或DelegateCommand在ViewModel(或在代码背后,如果你不使用MVVM)

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}" />

相关内容

最新更新