2011-12-18 14 views
8

Estoy construyendo una aplicación que utiliza bastantes comandos, y están abarrotando mi viewmodel. MVVM es nuevo para mí, así que lo siento si esta pregunta es un poco estúpida. ¿Hay alguna manera de reducir el desorden? Por ejemplo, aquí se puede ver la parte de la confusión ..¿Cómo puedo evitar el desorden de comandos en ViewModel?

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

También me interesaría ver una buena respuesta a esto, pero AFAIK es el precio a pagar por tener todo el valor del acoplamiento flojo. – Jon

Respuesta

5

Así que tienen comandos para:

  1. operaciones de archivo (abrir, guardar, cargar a Flicker)

  2. operaciones de ventana (pantalla completa, Close)

  3. edición (Rotar, Cambio de tamaño, color, etc.)

Considerar la agrupación (com posando) comandos relacionados juntos en una clase personalizada llamada, por ejemplo, FileCommands. Cree una jerarquía de niveles múltiples si corresponde. Si tiene un menú jerárquico en su vista, es probable que desee una jerarquía de comandos similar.

Luego, cree un controlador por grupo de comandos (por ejemplo, FileController) y en el controlador cree el método que registrará los comandos del grupo FileCommands con el servicio asociado.

Consulte las aplicaciones de ejemplo http://waf.codeplex.com/ (por ejemplo, BookController.cs) para obtener algunas ideas sobre cómo implementar realmente la asignación de Controller/ViewModel. Sin embargo, tenga en cuenta que no es exactamente el mismo escenario (no se rompen Comandos en grupos).

+0

Muy interesante, me gusta la idea. Parece un poco complicado (para mí como novato) pero voy a echarle un vistazo y dejarte saber cómo fui. Gracias por su respuesta :) –

+0

Si aún no quiere el Controlador, simplemente agrupe los comandos relacionados como se sugiere y divida el método InitializeCommands en InitializeFileCommands, InitializeWindowCommands, etc. – surfen

0

Su modelo de vista es significaba ser el nexo de unión entre la vista y el modelo. Esto implica que, a menos que pueda iterar genéricamente el Modelo, siempre consistirá en una enumeración de 'líneas de pegamento'.

El único desorden que me imagino que podría deshacerse es en caso de que no necesite literalmente las propiedades XXXCommand; en ese caso, se podría crear una colección de propiedad similar, las estructuras como (pseudo-código)

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

No hay ninguna otra razón para mantener las referencias a los objetos que se crean en aquí excepto para pegar a la visión correcta aglutinante.

Pero, de nuevo, ¿por qué no utilizar la expresión de propiedad para esto? De nuevo: la cantidad de desorden, como yo lo veo, es razonablemente limitada.

+0

Gracias por su respuesta, volveré a revisar el código y le preguntaré a mi maestra mañana.Volveré a publicar el código más tarde y podrá ver el resultado :) –

+0

Solo una nota: tener nombres en cadenas los hace invisibles para el compilador (es decir, no puede verificar la coherencia). Por otra parte; tampoco puede verificar si se usa una propiedad o no ... – FrankB

1

Use Caliburn Micro. Para un botón llamado name = "Logout", lo único que se necesita en ViewModel es un método público denominado Logout.

Y sin ataduras Convetion:

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

Luego, en el modelo de vista añadir un método llamado Retire y en esa muestra el DataContext se pasa al método.

+0

¿Qué es Caliburn Micro y qué fácil es comenzar con ¿eso? Actualmente estamos usando luz MVVM, ¿pueden usarse juntas? Gracias por su respuesta :) –

+0

CM es una convención basada en MvvM framwork para WPF y SL. http://caliburnmicro.codeplex.com/. Comenzar no es malo, pero no creo que uses ambos al mismo tiempo. –

Cuestiones relacionadas