1

MVVMでクリックイベントを処理する最良の方法は何ですか? 最善の方法はありますか?

私は2つの解決策を見つけました:

リレーコマンドで:

RelayCommand buttonAddCategory_Click;
public ICommand ButtonAddCategory_Click
{
    get
    {
        return buttonAddCategory_Click ?? (buttonAddCategory_Click = new RelayCommand(param => this.AddCategory(),
                                                                                      param => true));
    }
}

プロ: ?; contra:フォーカスなどのUI 要素を変更する場合は、イベントに関する回避策が必要です

付属の動作で:

public static bool GetIsResetMouseLeftButtonDown(TreeView treeView)
{
    return (bool)treeView.GetValue(IsResetMouseLeftButtonDownProperty);
}
public static void SetIsResetMouseLeftButtonDown(TreeView treeViewItem, bool value)
{
    treeViewItem.SetValue(IsResetMouseLeftButtonDownProperty, value);
}
public static readonly DependencyProperty IsResetMouseLeftButtonDownProperty =
    DependencyProperty.RegisterAttached("PreviewMouseLeftButtonDown", typeof(bool), typeof(TreeViewBehavior),
    new UIPropertyMetadata(false, OnIsMouseLeftButtonDownChanged));

プロ:UIの変更にはRoutedEventArgsがあります。反対: 他のコントロールへのアクセス?

現在、両方のソリューションを使用しています。Buttons の RellayCommand (UI 更新のイベントを含む) と、ユーザーがクリックした場合にツリービュー項目の選択を解除するためのツリービューの添付された動作。

4

2 に答える 2

1

私にとって、この質問に対する簡単な答えはありません。それが私がそれを見る方法です:

  • VM に状態変更が定義されている場合は、RelayCommand を公開し、それをトリガーする何かにバインドできます。99.9% のケースで、これはボタン/メニュー エントリです。気軽に使えるもの。残っているケース -> ビューからメソッドを呼び出すなど、いくつかの回避策が必要になる場合があります。したがって、実際に VM をターゲットにしている場合は、RelayCommand を使用する必要があります。

  • 一方、フォーカス変更はビュー関連の機能です。これはWMとは何の関係もありません。つまり、私にとってはビューに実装する必要があります。だから私は、仕事をする簡単なイベントハンドラーにさえ行きます。

hth、マーティン

于 2011-04-12T14:21:01.477 に答える
1

私はこのアイデアが好きです:

新しいウィンドウを開く、要素を表示/非表示にするなどの UI ロジック。コード ビハインドに保持します。

この「クリック」がモデルで何かを行う必要がある場合は、アクションを呼び出します。

したがって、ウィンドウを閉じて何かを保存するボタンは、次のように定義されます。

<Button  Name="SaveBtnr" VerticalAlignment="Bottom" 
        Command="{Binding Save}" Click="OnSaveClick"
        CommandParameter="{Binding}">Save</Button>

ハンドラーは次のようになります。

private void OnSaveClick(object sender, RoutedEventArgs e)
    {
        //Do UI Stuff
    }

そして、あなたのコマンド:

  public void SaveCommand(object parameter)
    {
        //SaveStuff            
    }
于 2011-09-15T12:10:40.593 に答える