在WPF中,自定义命令有事件处理程序,如command_Executed和command_CanExecute,最佳实践是实现逻辑不应该直接在代码后类中实现,它应该只包含对更高级别实现逻辑的函数调用。
在制作自定义命令时,如果在命令的处理函数中只有一个函数调用,则很容易将其直接放置在代码后面,但是如果有多个函数调用,或者函数调用返回的东西是要做出决定的基础上(特别是在command_CanExecute函数禁用/启用命令的情况下,必须决定何时启用或禁用命令)。我一直在考虑的可能性如下,哪一个在可维护性、保持代码整洁、软件工程原则和最佳实践方面是最合适的?
-
将所有函数调用和决策语句保留在代码后面(在command_execute或command_execute调用的代码后面的某些函数中)。如果代码很简单还好,但是当后面的代码中有很多处理程序时,事情就会变得很难看。这里没有实现代码,只有我之前提到的决策代码。
-
将实现逻辑保留在定义命令的类中,并使其可以通过静态属性访问。现在,代码后面的处理程序将只有一个函数调用,如果必须的话,它将接收返回值。
-
在实现应用程序实际功能的高级类中实现它,以便代码后置处理程序只有一个函数调用。这是最有意义的,但是这个选项在我心中产生了疑问,因为在某些情况下,命令处理程序可能必须调用来自许多不同的不相关类的方法,因此很难决定将逻辑放在哪里。
-
还有我错过的吗
通常我使用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}" />