CodeBehind WPFイベントを翻訳する方法。イベント、ハンドラー、イベントセッターからMVVMパターン?
質問
イベント、ハンドラー、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に関する親指のルールはほとんどありません。
- 君の
Models
とViewModles
参照しないでくださいSystem.Windows.Controls
名前空間。 - 君の
Models
とViewModles
イベントを処理しないでください。使用するICommand
そのためのインターフェイス。 RoutedCommand
モデル /ビューモデルでは有効ではありません(ポイント2のため)。したがって、使用します DeLegateCommand /RelayCommand
そうは言っても、上記のポイントはすべて完璧です 許可された あなたが書いた場合 添付の動作 の MVVM.
他のヒント
いくつかの選択肢があります:
イベントハンドラーをXAMLに添付しますが、イベントハンドラーが行う唯一のことは、適切な引数を渡すビューモデルに呼び出すことです(GUIレベルのアイテムをビューモデルに渡さないことが重要です - アクションを実行するために必要なデータのみです)
使用 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]" />
所属していません StackOverflow