Как я могу избежать беспорядка команды во 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);
}
3 ответа
Итак, у вас есть команды для:
Файловые операции (Открыть, Сохранить, Загрузить на Flicker)
Операции с окнами (Полный экран, Закрыть)
Редактирование (Поворот, Изменение размера, Цвет и т. Д.)
Рассмотрим группирование (создание) связанных команд вместе в пользовательском классе, который называется, например, FileCommands. Создайте многоуровневую иерархию, если применимо. Если у вас есть иерархическое меню в вашем представлении, вы, вероятно, захотите подобную командную иерархию.
Затем создайте один контроллер для каждой группы команд (например, FileController) и в методе создания контроллера, который будет регистрировать команды из группы FileCommands в связанной службе.
См. 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 должна быть связующим звеном между 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);
}
};
Нет никакой другой причины хранить здесь ссылки на объекты, которые вы создаете, кроме как приклеивать их к правильному связующему представлению.
Но опять же, почему бы не использовать идиому Property для этого? Опять же: количество беспорядка, на мой взгляд, разумно ограничено.