2012-04-28 23 views
4

我有一个WPF窗体上有16个按钮。当我的视图模型初始化时,我需要将全部16个设置为RelayCommand对象。这是我所有的Initialize()方法所做的,但这会导致代码分析错误CA1502:AvoidExcessiveComplexity。代码分析避免过度复杂 - 只需设置命令

这是抑制CA警告的好例子,还是有更好的方法来设置这些命令而不会导致CA违例?

[SuppressMessage("Microsoft.Maintainability", "CA1502:AvoidExcessiveComplexity", Justification = "Simply setting the commands")] 
private void Initialize() 
{ 
    this.AddApplicationCommand  = new RelayCommand(_ => AddApplication()); 
    this.DeleteApplicationCommand = new RelayCommand(_ => DeleteApplication(), _ => ApplicationIsSelected); 
    this.RefreshApplicationsCommand = new RelayCommand(_ => RefreshApplications()); 
    this.SaveApplicationCommand  = new RelayCommand(_ => SaveApplication(), _ => ApplicationIsSelected); 

    this.ForceInstallationCommand  = new RelayCommand(_ => ForceInstallation(), _ => ApplicationIsSelected); 
    this.DeleteForceInstallationCommand = new RelayCommand(_ => DeleteForceInstallation(), _ => ApplicationIsSelectedAndForceExists()); 

    this.AddTaskCommand   = new RelayCommand(_ => AddTask(), _ => ApplicationIsSelected); 
    this.EditTaskCommand   = new RelayCommand(_ => EditTask(), _ => TaskIsSelected()); 
    this.DeleteTaskCommand   = new RelayCommand(_ => DeleteTask(), _ => TaskIsSelected()); 
    this.ImportTasksCommand  = new RelayCommand(_ => ImportTasks(), _ => ApplicationIsSelected); 
    this.ExportTasksCommand  = new RelayCommand(_ => ExportTasks(), _ => TaskIsSelected()); 
    this.ImportLegacyTasksCommand = new RelayCommand(_ => ImportLegacyTasks(), _ => ApplicationIsSelected);    
    this.MoveTaskUpCommand   = new RelayCommand(_ => MoveRowUp(), _ => TaskIsSelected()); 
    this.MoveTaskDownCommand  = new RelayCommand(_ => MoveRowDown(), _ => TaskIsSelected()); 

    this.AddVariableGroupCommand = new RelayCommand(_ => AddVariableGroup()); 
    this.RemoveVariableGroupCommand = new RelayCommand(_ => RemoveVariableGroup(), _ => VariableGroupIsSelected()); 
} 

回答

1

看起来是可读的,因此压制对我来说可以(假设你不能改变RelayCommand)。

如果您可以控制RelayCommand类 - 添加构造函数RealayCommand(Action, Func<bool>)以消除额外的包装器lambda /委托创建。

如果您希望有更多按钮考虑使用{button,action,enabled}条目切换到表格。

编辑:为了通过每行取出的代表创作,你可以从

new RelayCommand(_ => MoveRowDown(), _ => TaskIsSelected()); 

更改代码

new RelayCommand(MoveRowDown, TaskIsSelected); 

通过添加新的构造简化代码,设置的Fileds本身:

public RelayCommand(Action action, Func<bool> enabled) 
{ 
    this._execute = _ => action(); 
    this._enabled = _ => enabled(); 
} 

或调用现有构造函数的新构造函数:

public RelayCommand(Action action, Func<bool> enabled) 
: this(_ => MoveRowDown(), _ => TaskIsSelected()) {} 
+0

我确实可以控制RelayCommand。我不明白,但我已经使用它的构造函数:public RelayCommand(Action execute,Predicate canExecute)。你的建议与使用该建议有何不同? – 2012-04-28 19:09:12

+0

您正在使用_ => F()lambdas将您的零参数函数转换为一个参数一次以用于操作和谓词。如果您不需要这种转换代码,将会更加紧凑的Relay(DeleteTask,IsApp)并且不会有任何警告。 – 2012-04-28 19:12:46

+0

我想我现在看到你在说什么。因为我的Action和Func不使用这些参数,所以删除它们。唯一的问题是System.Windows.Input.ICommand指定了这个:bool CanExecute(对象参数)。 RelayCommand为WPF绑定实现ICommand。 – 2012-04-28 19:44:47