2011-12-18 30 views
8

我正在構建一個使用相當多的命令的應用程序,並且它們混亂了我的視圖模型。 MVVM對我來說是新手,所以如果這個問題有點愚蠢,那麼很抱歉。有沒有辦法減少混亂?例如在這裏你可以看到雜亂的一部分..如何避免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

我也有興趣看到一個很好的答案,但AFAIK這是所有的鬆耦合善良支付的代價。 – Jon 2011-12-18 15:08:48

回答

5

讓你有命令:

  1. 文件操作(打開,保存,上傳到閃爍)

  2. 窗口操作(全屏,關閉)

  3. 編輯(旋轉,顏色等)

考慮分組(com擺出)相關命令一起在一個自定義類中調用,例如FileCommands。如果適用,創建多級分層結構。如果您的視圖中有層次菜單,您可能需要類似的命令層次結構。

然後,爲每個命令組(例如FileController)創建一個控制器,並在控制器創建方法中將FileCommands組中的命令與相關服務一起註冊。

請參閱http://waf.codeplex.com/示例應用程序(例如BookController.cs)瞭解如何實際實現Controller/ViewModel映射的一些想法。但請注意,它並不完全相同(不會將命令分爲組)。

+0

非常有趣,我喜歡這個主意。看起來有點複雜(對我來說,作爲一個新手),但我會看看它,讓你知道我是怎麼去的!感謝您的回答:) – 2011-12-18 16:23:41

+0

如果您不想要控制器,那麼只需按照建議對相關命令進行分組,然後將InitializeCommands方法分爲InitializeFileCommands,InitializeWindowCommands等。 – surfen 2011-12-18 16:40:10

0

您的視圖模型是意味着是視圖和模型之間的膠水。這意味着,除非您可以一般地重複模型,否則它將總是包含「膠水線」的枚舉。

我可以想象你可以擺脫的唯一混亂是你不需要字面上的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); 
    } 
}; 

沒有其他的理由讓你在這裏創建,除了它們膠粘到正確的視圖中的對象引用的集合粘合劑。

但是再次,爲什麼不使用屬性成語呢?再說一遍:正如我所見,雜亂無章的數量是有限的。

+0

謝謝你的回答,我會再次查看代碼並明天問我的老師。我稍後會重新發布代碼,您可以看到結果:) – 2011-12-18 15:30:43

+0

只需要注意一點:在字符串中使用名稱會使編譯器不可見(即無法檢查一致性)。另一方面;它也無法檢查一個屬性是否被使用或不... – FrankB 2012-09-24 10:28:34

1

使用Caliburn Micro。對於名爲name =「Logout」的按鈕,ViewModel中唯一需要的是名爲Logout的公共方法。

而且沒有convetion綁定:

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

然後在視圖模型添加一個方法命名刪除和樣品中的DataContext傳遞給方法。

+0

什麼是Caliburn Micro,它開始使用起來有多容易它?我們目前使用MVVM燈,它們可以一起使用嗎?感謝您的迴應:) – 2011-12-18 16:22:43

+0

CM是一個基於WPF和SL的基於約定的MvvM框架。 http://caliburnmicro.codeplex.com/。入門並不糟糕,但我不認爲你會同時使用兩者。 – 2011-12-18 16:35:18