2011-12-18 14 views
8

かなりの数のコマンドを使用するアプリケーションを構築しています。それらは私のviewmodelを乱雑にしています。 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

答えて

5

ですからするためのコマンドがあります。

  1. ファイル操作(開く、保存は、フリッカーにアップロード)

  2. ウィンドウ操作(フルスクリーン、閉じる)

  3. 編集(回転し、リサイズ、カラーなど)

例えば、FileCommandsと呼ばれるカスタムクラスに関連するコマンドをまとめています。該当する場合は、複数レベルの階層を作成します。ビューに階層メニューがある場合は、同様のコマンド階層が必要になるでしょう。

コマンドグループごとにコントローラ(たとえばFileController)を作成し、FileCommandsグループのコマンドを関連するサービスに登録するコントローラ作成メソッドで作成します。

Controller/ViewModelマッピングを実際に実装する方法のアイデアについては、http://waf.codeplex.com/サンプルアプリケーション(たとえばBookController.cs)を参照してください。ただし、全く同じシナリオではありません(コマンドをグループに分割しないでください)。

+0

非常に興味深い、私はアイデアが好きです。ちょっと複雑に思えます(初心者の私にとって)、私はそれを見て、私がどうやって行ったかを教えてくれるでしょう!あなたの答えをありがとうございます:) –

+0

コントローラにしたくない場合は、関連するコマンドを推奨するようにグループ化し、InitializeCommandsメソッドをInitializeFileCommands、InitializeWindowCommandsなどに分割します。 – surfen

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); 
    } 
}; 

正しい表示にそれらを接着するため除いて、あなたがここで作成したオブジェクトへの参照を維持する他の理由がありませんバインダー。

もう一度、このためにプロパティイディオムを使用してみませんか?繰り返しますが、クラッタの量は、私が見るように、合理的に制限されています。

+0

あなたの答えをありがとう、私はコードをもう一度見て、明日先生に尋ねるでしょう。後でコードを再投稿し、結果を見ることができます:) –

+0

ちょうど1つの注意:文字列に名前を付けると、コンパイラに見えなくなります(つまり、一貫性をチェックできません)。一方;それはまた、プロパティが使用されているかどうかをチェックすることはできません... – FrankB

1

Caliburn Microを使用してください。 name = "Logout"という名前のボタンの場合、ViewModelで必要なのはLogoutというパブリックメソッドのみです。

そしてconvetionバインディングなし:

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

その後のViewModelには、Removeという名前のメソッドを追加し、そのサンプル中のDataContextは、メソッドに渡されます。

+0

Caliburn Microとは何ですか?それ?私たちは現在MVVMの光を使用していますが、一緒に使用できますか?あなたの応答をありがとう:) –

+0

CMは、WPF&SLのためのMvvMのフレームワークに基づいています。 http://caliburnmicro.codeplex.com/。始めるのは悪くないが、私はあなたが同時に両方を使うとは思わない。 –

関連する問題