CodeBehind WPFイベントを翻訳する方法。イベント、ハンドラー、イベントセッターからMVVMパターン?

StackOverflow https://stackoverflow.com/questions/7816067

  •  26-10-2019
  •  | 
  •  

質問

イベント、ハンドラー、EventsetterからMVVMパターンなどのWPF CodeBehidイベントを翻訳しようとしています。 MVVMを使用しているため、system.windows.controlsを使用することは許可されていません。また、この問題を解決するためにサードパーティライブラリも避けています。

誰かが次のCodeBehindイベントハンドラーをMVVMイベントハンドラーに変換する方法を説明できますか?答えを書いている間、できる限り説明してください。

XAMLコード

<DataGridCheckBoxColumn Header="Select" Binding="{Binding Path=IsSelected}"> 
  <DataGridCheckBoxColumn.CellStyle> 
    <Style TargetType="DataGridCell"> 
      <EventSetter Event="MouseLeftButtonUp" Handler="ApprovedMouseUp"></EventSetter> 
    </Style> 
  </DataGridCheckBoxColumn.CellStyle> 
</DataGridCheckBoxColumn> 

背後にコード

private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 
        var temp = (sender as DataGridCell).Content; 
        if(temp is CheckBox) (temp as CheckBox).IsChecked = !(temp as CheckBox).IsChecked; 
    } 
} 
役に立ちましたか?

解決

MVVMに関する親指のルールはほとんどありません。

  1. 君の ModelsViewModles 参照しないでください System.Windows.Controls 名前空間。
  2. 君の ModelsViewModles イベントを処理しないでください。使用する ICommand そのためのインターフェイス。
  3. RoutedCommand モデル /ビューモデルでは有効ではありません(ポイント2のため)。したがって、使用します DeLegateCommand / RelayCommand

そうは言っても、上記のポイントはすべて完璧です 許可された あなたが書いた場合 添付の動作MVVM.

他のヒント

いくつかの選択肢があります:

  1. イベントハンドラーをXAMLに添付しますが、イベントハンドラーが行う唯一のことは、適切な引数を渡すビューモデルに呼び出すことです(GUIレベルのアイテムをビューモデルに渡さないことが重要です - アクションを実行するために必要なデータのみです)

  2. 使用 eventtocommand iCommandのインスタンス(ビューモデルから)をあなたのビューのイベントに添付するための動作(ここで紹介されています)

これらのイベントハンドラーをスタイルやテンプレートで設定しようとしていない限り、オプション#1を追求することをお勧めします。すべての作業を実行します

編集:オプション#1

private void ApprovedMouseUp(object sender, MouseButtonEventArgs e) 
{ 
    if(sender is DataGridCell) 
    { 

        var checkBox= (sender as DataGridCell).Content as CheckBox; 
        if(checkBox != null) 
        {
            var viewModel = (MyViewModel)checkBox.DataContext;
            viewModel.ToggleApprovedStatus();
        }
    } 
} 

使用することもできます Caliburn Micro ビューモデルでハンドラーを視聴するイベントに添付できるライブラリ。

サンプルコード:

 ...  xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro"....

 <Button Content="Edit" DataContext="{Binding Path=VmInstance}" 
             cal:Message.Attach="[Event Click] = [Action EditFilter]" />
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top