2

MVVM の比較的新しい - これは単純な質問ですが、答えが見つからないようです。

4 つのグループ化されたラジオ ボタンがあり、いずれかを選択すると関連するオプションが表示されます。これらの 4 つのラジオ ボタンは、この場合は と呼ばれる同じビューモデル コマンドにリンクする必要があると思いますUpdateIndex

適切なアクションを実行して適切なオプションを表示できるように、どのラジオ ボタンが を呼び出しているを判断するにはどうすればよいですか?UpdateIndex

UpdateIndexmy andは、ラジオ ボタン コマンド バインディングから正しく呼び出されることに注意してくださいUpdateIndexExecute。どのラジオ ボタンがそれを呼び出しているかを判断する方法がわかりません。関係があると思いますCommandParameterが、ビューモデルからアクセスする方法がわかりません。

私のラジオボタンの例:

<RadioButton
    Content="Option 1"
    GroupName="GroupHeader"
    Command="{Binding UpdateIndex}" />

クリックしたときにラジオボタンから呼び出されるコマンドのコードスニペット...

void UpdateIndexExecute()
{

}

bool CanUpdateIndex()
{
   return true;
}

public ICommand UpdateIndex
{
    get
    {
        return new RelayCommand(UpdateTabIndexExecute, CanUpdateTabIndex);
    }
}
4

2 に答える 2

1

真の MVVM 実装では、ViewModel には View に関する情報が含まれていないため、どの RadioButton がコマンドを実行したかはわかりません。ユーザー コントロールは、「ViewModel ではなく、View 内にのみ存在するもの」のカテゴリに完全に分類されます。代わりに、意味のあるものを ViewModel に渡す必要があります。

コマンド バインディングの「CommandParameter」を使用して ICommand に情報を渡す方法があります。そのためには、「ジェネリック」形式の RelayCommand ( RelayCommand ) クラスを使用します。「T」は、パラメーターとして渡すオブジェクトのタイプを表します。

インデックスをパラメーターとして渡そうとしているだけなら、次のようになると思います。

<!-- We are passing index "1" as a parameter -->
<RadioButton Content="Option 1"  GroupName="GroupHeader" 
             Command="{Binding UpdateIndex, CommandParameter=1}"/> 

次に、ViewModel で次のようにします。

void UpdateIndexExecute(int index)
{

}
    
bool CanUpdateIndex(int index)
{
    return true;
}

public ICommand UpdateIndex 
{ 
    get 
    { 
        return new RelayCommand<int>(UpdateTabIndexExecute, CanUpdateTabIndex); 
    } 
}
于 2013-05-15T14:27:10.523 に答える
0

コマンドをバインドする代わりに、コンテンツをバインドし、INotifyPropertyChanged インターフェイスを使用して、コントロールによって行われた変更を処理できます。

于 2013-05-15T14:51:44.117 に答える