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

时间:2011-10-17 15:41:08

标签: .net wpf code-behind routed-commands

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

在创建自定义命令时,如果命令的处理函数中只有一个函数调用,则将它直接放在代码隐藏中很简单,但如果有多个函数调用或函数调用返回某些内容怎么办?在做出决定的基础上(特别是在禁用/启用命令的command_CanExecute函数的情况下,必须决定何时启用或禁用命令)。我一直在考虑的可能性是哪一个,哪个最适合维护,保持代码清洁,软件工程原理和最佳实践?

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

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

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

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

1 个答案:

答案 0 :(得分:4)

通常我在ViewModel中使用RelayCommandDelegateCommand(如果您不使用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}" />