Как я могу избежать беспорядка команды во ViewModel? - PullRequest
8 голосов
/ 18 декабря 2011

Я создаю приложение, которое использует довольно много команд, и они загромождают мою модель представления. 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 ]

5 голосов
/ 18 декабря 2011

Итак, у вас есть команды для:

  1. Операции с файлами (Открыть, Сохранить, Загрузить на Flicker)

  2. Операции с окнами (полный экран, закрытие)

  3. Редактирование (вращение, изменение размера, цвета и т. Д.)

Рассмотрите возможность группировки (составления) связанных команд вместе в пользовательском классе, который называется, например, FileCommands. Создайте многоуровневую иерархию, если применимо. Если у вас есть иерархическое меню в вашем представлении, вы, вероятно, захотите подобную командную иерархию.

Затем создайте один Controller для каждой группы команд (например, FileController) и в методе создания контроллера, который будет регистрировать команды из группы FileCommands со связанной службой.

См. http://waf.codeplex.com/ примеры приложений (например, BookController.cs) для некоторых идей о том, как на самом деле реализовать отображение Controller / ViewModel. Однако обратите внимание, что это не совсем тот же сценарий (без разбиения команд на группы).

1 голос
/ 18 декабря 2011

Используйте Caliburn Micro. Для кнопки с именем name = "Logout" единственной вещью, необходимой в ViewModel, является открытый метод с именем Logout.

И без конвекционных привязок:

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

Затем в ViewModel добавьте метод с именем Remove, и в этом примере DataContext будет передан методу.

0 голосов
/ 18 декабря 2011

Ваша 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);
   }
};

Нет никакой другой причины хранить ссылки на объекты, которые вы здесь создаете, за исключением склеивания их с правильным подшивкой.

Но опять же, почему бы не использовать для этого идиому Собственности? Опять же: количество беспорядка, на мой взгляд, разумно ограничено.

...