2016-10-11 12 views
0

私は質問がありますが、私はMVVMについて多くのチュートリアルを見ましたが、私はまだ混乱しています。 私は、複数のボタンを持つインターフェースを持っています。私は、コマンドをViewにバインドするためのICommandインターフェースを実装する必要があります。インターフェイス内の各ボタンのクラスを作成する必要がありますか?

私はこのようにそれをやった:

MainSolution

Main Solution 
    Model 
     SomeClass.cs 
    ViewModel 
     Commands 
      SomeCommands.cs 
     SomeViewModel.cs 

[OK]を、今、私は1つのボタンが複数あるインタフェースで、それぞれが別々のことを行う、たとえば、スレッドを開始するために1がありますそれをキャンセルするための他のものと別のもののための第3のもの。 ViewにあるボタンごとにICommandインターフェイスを実装する別のクラスを作成する必要がありますか?

Main Solution 
    Model 
     SomeClass.cs 
    ViewModel 
     Commands 
      StartCommands.cs 
      CancelCommands.cs 
      OtherCommands.cs 
     SomeViewModel.cs 

私はICommandのインターフェイスを実装するとき、私は唯一の方法、そして唯一の「CanExecute」方法を「実行」しているので、私はこれを聞いていますのよ。バインディングを通じてビューに複数のボタンを実装する一般的な方法は何ですか?

私は幸運なことなくオンラインで検索しました...それらの多くはとても混乱していて、確かに私のような初心者のためではありません。

もう1つは、複数のViewModelと複数のViewModelがある場合、複数のコマンドフォルダを作成してネストする必要がありますか?

Main Solution 
    Model 
     SomeClass.cs 
    ViewModel 
     FirstCommands 
      StartCommands.cs 
      CancelCommands.cs 
      OtherCommands.cs 
     SecondCommands 
      StartCommands.cs 
      CancelCommands.cs 
      OtherCommands.cs 
     FirstViewModel.cs 
     SecondViewModel.cs 

答えて

2

従来のMVVMアプローチでは、コマンドごとに別々のクラスを持つIMHOは過度の攻撃です。 MVVMLightのRelayCommand(パラメータを渡す場合はgeneric one)のようなものを使用してください。

は、次に、あなたのViewModelのメンバーとして、あなたのコマンドを定義することができますし、同様にあなたのViewModelの一部としてExecute/CanExecute実装を提供します。

public RelayCommand MyCommand { get; } 

public MyView() 
{ 
    //[...] 
    this.MyCommand = new RelayCommand(this.ExecuteMyCommand, this.CanExecuteMyCommand); 
} 

public void ExecuteMyCommand() 
{ 
    //do work! 
} 

public bool CanExecuteMyCommand() 
{ 
    //optional - control if command can be executed at a given time 
} 

をそして、あなたはあなたのビューがバインドされていると仮定すると(XAMLでMyCommandに結合することができ、あなたのViewModel):

+0

なぜRelayCommandも「タイプ」を受け入れますか?(RelayCommand )、これで何ができますか?何の一種? – exSnake

+0

パラメータ。 http://stackoverflow.com/questions/32064308/how-to-pass-command-parameter-to-method-in-viewmodel-in-wpfを参照してください。 – decPL

1

DelegateCommandクラスがあります。あなたはcan use Prism、またはちょうどGoogleの周りに盗んで1つ; here's one on StackOverflow私はテストしていませんが正式に見えます。コマンドにパラメータを必要としない場合は、引数parameterを無視してください。

DelegateCommandICommandを実装し、Actionまたはあなたが(上記のリンクStackOverflowの回答から)ので、同様に、そのコンストラクタに渡すAction<object>呼び出す:

public DelegateCommand AddFolderCommand { get; protected set; } 
public MyViewModel(ExplorerViewModel explorer) 
{   
    AddFolderCommand = new DelegateCommand(ExecuteAddFolderCommand, (x) => true); 
} 

public void ExecuteAddFolderCommand(object param) 
{   
    MessageBox.Show("this will be executed on button click later"); 
} 

これはWPFに含まれている必要がありますが、wasnを何らかの理由で。

+0

これとRelayCommandとの主な違いは何ですか? – exSnake

+0

@exSnake唯一の違いは名前です。トマト、トマト。彼らは同じことをする。何人かはそれを一つと呼び、ある人はそれをもう一つと呼んでいます。名前や他の名前の下で同じことをする実装がたくさんあります。 –

+0

@exSnake私はdecPLの強く型付けされたジェネリックパラメータバージョンを個人的に好きです。しかし、あなたの選択を取る。 –

関連する問題