開発環境
C#でWPFアプリケーションを作成中
Visual Studio 2019
使用しているMVVMパッケージ Prism
質問のポイント
Prismらしいイベントハンドラーの記述方法が知りたい。特にsenderなどの情報を利用するためのDelegateCommand宣言方法を知りたい。
前提:知っている情報(イベントハンドラー)
コードビハインドにイベントハンドラーの本体を書き、XAMLでEventSetterを使えばイベントを作れることを確認しました。しかし、これはあまりPrism的ではないのではないかとなんとなく感じています。コードビハインドの記述が増えるのも気になります。コードビハインドに記述することなくsenderやeの情報を利用したいところなのですが・・・。
C#
1// View.xaml.cs 2private void TestEventHandler(object sender, MouseButtonEventArgs e) 3{ 4 Console.WriteLine("test"); 5 // senderやeの情報利用可能。 6}
XAML
1<!-- View.xaml --> 2<Page.Resources> 3 <Style TargetType="{x:Type DataGridRow}"> 4 <EventSetter Event="MouseLeftButtonUp" Handler="TestEventHandler"/> 5 </Style> 6</Page.Resources>
前提:知っている情報(Prismでのボタンクリックイベント)
DelegateCommandを使えばXAML側のCommandにメソッドをバインディングできることは知っています。
C#
1// ViewModel.cs 2private DelegateCommand clickEvent; 3public DelegateCommand ClickEvent => this.clickEvent ?? (this.clickEvent = new DelegateCommand(this.ExecuteClickEvent)); 4private void ExecuteClickEvent() 5{ 6 Console.WriteLine("test"); 7}
XAML
1<!-- View.xaml --> 2<Button Command="{Binding ClickEvent}"/>
本題:知りたい情報(ViewModelでイベントハンドラーを記述したい。あるいはPrism的なイベントハンドラー記述方法を知りたい)
下記は想像で作成したコードですが、例えばこのような方向性ですっきり書く方法はないのでしょうか?
C#
1// [注意]推測と想像で作成した動かないコード 2// ViewModel.cs 3private DelegateCommand(object sender, MouseButtonEventArgs e) eventHandler; 4public DelegateCommand(object sender, MouseButtonEventArgs e) ClickEvent => this.clickEvent ?? (this.clickEvent = new DelegateCommand(this.ExecuteClickEvent)); 5private void ExecuteClickEvent(object sender, MouseButtonEventArgs e) 6{ 7 Console.WriteLine("test"); 8 // senderやeの情報利用可能。 9}
XAML
1<!-- [注意]推測と想像で作成した動かないコード --> 2<!-- View.xaml --> 3<Page.Resources> 4 <Style TargetType="{x:Type DataGridRow}"> 5 <EventSetter Event="MouseLeftButtonUp" Handler="TestEventHandler"/> 6 <!-- 特に何も指定しなくてもViewModel.cs側でobjectとMouseButtonEventArgsが割り当てられる --> 7 </Style> 8</Page.Resources>
以上です。WPFとPrismを使ったことがある方の返信をいただけると幸いです。
回答2件
あなたの回答
tips
プレビュー