我正在构建一个使用相当多命令的应用程序,它们使我的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<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);
}
答案 0 :(得分:5)
所以你有命令:
文件操作(打开,保存,上传到闪烁)
窗口操作(全屏,关闭)
编辑(旋转,调整大小,颜色等)
考虑在一个名为FileCommands的自定义类中将相关命令组合在一起(组合)。如果适用,创建多级层次结构。如果视图中有分层菜单,则可能需要类似的命令层次结构。
然后,为每个命令组(例如FileController)和控制器创建方法创建一个 Controller ,该方法将使用相关服务注册FileCommands组中的命令。
有关如何实际实现Controller / ViewModel映射的一些想法,请参阅http://waf.codeplex.com/示例应用程序(例如BookController.cs)。但请注意,这不是完全相同的情况(没有将命令分成组)。
答案 1 :(得分:1)
使用Caliburn Micro。对于名为name =“Logout”的按钮,ViewModel中唯一需要的是名为Logout的公共方法。
没有对话绑定:
<Button Content="Remove"
cal:Message.Attach="[Event Click] = [Action Remove($dataContext)]" />
然后在ViewModel上添加一个名为Remove的方法,并在该示例中将DataContext传递给该方法。
答案 2 :(得分:0)
您的ViewModel 意味着成为视图和模型之间的粘合剂。这意味着,除非您可以一般地迭代模型,否则它将始终包含“胶线”的枚举。
我可以想象你能摆脱的唯一杂乱是因为你不需要字面上的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活页夹外,没有其他理由继续引用您在此处创建的对象。
但话又说回来,为什么不使用属性成语呢?再说一次:正如我所看到的那样,杂乱的数量是相当有限的。