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

本文关键字:命令 混乱 何避免 ViewModel | 更新日期: 2023-09-27 18:18:17

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

    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<DragEventArgs>(e => OnFileDrop(this, e));
        Messenger.Default.Register<User>(this, "UserLogin", SetUser);
        Messenger.Default.Register<FlickrAccount>(this, "AddedAccount", AddAccount);
        Messenger.Default.Register<string>(this, "INeedAUser", SendUser);
        Messenger.Default.Register<string>(this, "INeedAImage", SendImage);
    }

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

你有以下命令:

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

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

  3. 编辑(旋转,调整大小,颜色等)

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

然后,为每个命令组(例如FileController)创建一个Controller,并在Controller create方法中将来自filecommand组的命令注册到相关的服务。

请参阅http://waf.codeplex.com/示例应用程序(例如BookController.cs),了解如何实际实现Controller/ViewModel映射。但是请注意,这不是完全相同的场景(没有将命令分成组)。

使用Caliburn Micro。对于一个名为name="Logout"的按钮,ViewModel中只需要一个名为Logout的公共方法。

并且没有约定绑定:

<Button Content="Remove"
        cal:Message.Attach="[Event Click] = [Action Remove($dataContext)]" />

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

你的ViewModel是意味着是视图和模型之间的粘合剂。这意味着,除非你可以对Model进行一般迭代,否则它将始终由'glue-lines'的枚举组成。

我能想象你唯一能摆脱的混乱是在你不需要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);
   }
};

没有其他理由保持对你在这里创建的对象的引用,除了将它们粘到正确的视图绑定器上。

但是,为什么不使用Property习语呢?再说一次:在我看来,杂乱的数量是合理有限的。