2011-01-03 8 views
2

イベントを処理するために私のビューモデルでコマンドを使用しています。例えば、私は、このようなボタンのクリックイベント処理していますように:Silverlight MVVM:私の(オブジェクト送信者、RoutedEventArgs e)はどこに行きましたか?

XAMLを

  <i:Interaction.Triggers> 
       <i:EventTrigger EventName="Click"> 
        <i:InvokeCommandAction Command="{Binding mvvmButtonclick}" /> 

       </i:EventTrigger> 
      </i:Interaction.Triggers> 

のViewModelコード

public ICommand mvvmButtonclick 
    { 
     get; 
     private set; 
    } 

のViewModelコンストラクタのコードは、コマンドをwireupする

this.mvvmButtonclick = new ActionCommand(this.ButtonClickedEvent); 
ボタンの上に呼び出されるのviewmodelで

実際の方法は、この作品

private void ButtonClickedEvent() 
    { 
     MessageBox.Show("worked!!!"); 
    } 

をクリックします。だから私の質問は:

  • これは正しい方法ですか?
  • (object sender、RoutedEventArgs e)パラメータを私のviewmodelに伝える方法はありますか?
  • これがリストボックス選択変更イベントで、ボタンクリックではないとします。 オブジェクト送信者、SelectionChangedEventArgs eパラメータなしで、選択したアイテムの値を取得するにはどうすればよいですか?

答えて

3

インタラクショントリガーが提供するように設計されているビューとビューモデルの分離のポイントが不足している可能性があります。

インタラクショントリガーの目的は、設計者(通常はBlendを使用)がビューモデルでコマンドを呼び出せるようにすることです。このようなコマンドを呼び出すUI要素およびUI要素のイベントは、デザイナーです。

しかし、ViewModelでは、このようなコマンドの呼び出し中にEventArgsの特定の派生物を提供する必要がある場合、それはデザイナーの手を少しでも引き締めます。これは、ビューとビューモデルの間の結合の種類を作り出し、相互作用のトリガーが排除することを目指します。

最終的な質問として、リストボックス内の現在選択されている項目を判断し、変更時に通知を受ける方法は、ListBoxのSelectedItemにバインドされているプロパティをビューモデルに作成することです。この種の作業のために従業員の対話トリガーやコマンドは必要ありません。

2

EventArgsの転送を可能にするいくつかのフレームワーク(Catelなど)があります。

http://catel.codeplex.com/SourceControl/changeset/view/508b404f2c57#src%2fCatel.Windows35%2fMVVM%2fCommands%2fCommand.cs

クラスはSilverlightとWPFの両方と互換性がある:たとえば、この実装を参照してください。

EventArgsを使用しない場合は、ViewModelでSelectedObjectプロパティを作成し、それをリストボックスのSelectedItemにバインドする必要があります。

Catelには、MVVMとEventToCommandクラスを使用してリストボックス内の選択した項目を編集する2つのサンプルアプリケーション(WPFとSilverlightの両方)が含まれています。私はそれがあなたが探しているものだと思います!

関連する問題