如何避免ViewModel中的命令混乱?

我正在构建一个使用相当多命令的应用程序,它们使我的viewmodel变得混乱。 MVVM对我来说是新手,很抱歉,这个问题有点愚蠢。 有没有办法减少混乱? 例如,在这里你可以看到杂乱的一部分..

private void InitializeCommands() { LogoutCommand = new RelayCommand(Logout); OpenCommand = new RelayCommand(SetImage); SaveCommand = new RelayCommand(SaveImage, SaveImageCanExecute); UploadToFlickrCommand = new RelayCommand(UploadToFlickr); CropCommand = new RelayCommand(SetCropMouseEvents); RemoveRedEyeCommand = new RelayCommand(SetRemoveRedEyeMouseEvents); TextInputCropCommand = new RelayCommand(CropFromText); ReloadImageCommand = new RelayCommand(ReloadImage); FlipYCommand = new RelayCommand(FlipY); Rotate90RCommand = new RelayCommand(Rotate90R); FlipXCommand = new RelayCommand(FlipX); ToGrayscaleCommand = new RelayCommand(ToGrayscale); ToSepiaCommand = new RelayCommand(ToSepia); WindowClosingCommand = new RelayCommand(WindowClosing); EffectsViewCommand = new RelayCommand(() => CurrentToolView = new EffectsView()); AddTextCommand = new RelayCommand(() => CurrentToolView = new AddTextView()); ResizeCommand = new RelayCommand(() => CurrentToolView = new ResizeView()); CropViewCommand = new RelayCommand(() => CurrentToolView = new CropView()); RedEyeCommand = new RelayCommand(() => CurrentToolView = new RedEyeView()); RotateViewCommand = new RelayCommand(() => CurrentToolView = new RotateView()); ExitCommand = new RelayCommand(() => Application.Current.Shutdown()); FullscreenCommand = new RelayCommand(() => { var fs = new FullscreenView {FullscreenImage = CurrentImage.LoadedImage}; fs.Show(); }); HandleDropCommand = new RelayCommand(e => OnFileDrop(this, e)); Messenger.Default.Register(this, "UserLogin", SetUser); Messenger.Default.Register(this, "AddedAccount", AddAccount); Messenger.Default.Register(this, "INeedAUser", SendUser); Messenger.Default.Register(this, "INeedAImage", SendImage); } 

所以你有命令:

  1. 文件操作(打开,保存,上传到闪烁)

  2. 窗口操作(全屏,关闭)

  3. 编辑(旋转,resize,颜色等)

考虑将相关命令分组(编写)在一个称为FileCommands的自定义类中。 如果适用,创建多级层次结构。 如果视图中有分层菜单,则可能需要类似的命令层次结构。

然后,为每个命令组(例如FileController)创建一个Controller ,并在控制器create方法中创建一个方法,该方法将使用相关服务注册FileCommands组中的命令。

有关如何实际实现Controller / ViewModel映射的一些想法,请参见http://waf.codeplex.com/示例应用程序(例如BookController.cs)。 但请注意,它不是完全相同的情况(没有将命令分成组)。

使用Caliburn Micro。 对于名为name =“Logout”的按钮,ViewModel中唯一需要的是名为Logout的公共方法。

没有对流绑定:

  

然后在ViewModel上添加一个名为Remove的方法,并在该示例中将DataContext传递给该方法。

ViewModel 意味着 View和Model之间的粘合剂。 这意味着,除非您可以一般地迭代模型,否则它将始终包含“胶线”的枚举。

我可以想象你能摆脱的唯一混乱是万一你不需要XXXCommand属性; 在这种情况下,您可以创建一个类似属性的结构集合,如(伪代码)

 private void createCommands() { var commands={ "Logout"=>new RelayCommand(Logout), "Exit"=>new RelayComand( ()=>Application.Current.Shutdown() ), .... }; foreach( var key,cmd in commands ){ glue(key,cmd); } }; 

除了将它们粘贴到正确的View活页夹之外,没有其他理由继续引用您在此处创建的对象。

但话又说回来,为什么不使用Property成语呢? 再说一遍:正如我所看到的那样,杂乱的数量是相当有限的。