2

ビューモデルでコマンドを使用してイベントを処理しています。たとえば、次のようなボタン クリック イベントを処理しています。

XAML

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

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

ビューモデル コード

   public ICommand mvvmButtonclick
    {
        get;
        private set;
    }

コマンドを接続する Viewmodel コンストラクター コード

this.mvvmButtonclick = new ActionCommand(this.ButtonClickedEvent);

ボタンのクリックで呼び出されるビューモデルの実際のメソッド

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

これは機能します。だから私の質問は:

  • これは正しい方法ですか?
  • (オブジェクト送信者、RoutedEventArgs e) パラメータをビューモデルに伝播する方法はありますか?
  • これがボタンのクリックではなく、リストボックスの選択変更イベントであるとします。オブジェクト送信者、SelectionChangedEventArgs eパラメータなしで、選択した項目の値を取得するにはどうすればよいですか?
4

2 に答える 2

3

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

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

ただし、ViewModel がEventArgsコマンドの呼び出し中に特定の派生物を提供する必要がある場合は、設計者の手を少し縛ることになります。それは、相互作用のトリガーが排除しようとするビューとビューモデルの間の一種の結合を作成します。

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

于 2011-01-03T21:54:58.677 に答える
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 の両方) が含まれています。それがあなたが探しているものだと思います!

于 2011-01-03T19:02:00.193 に答える