スタイルがあり、EventSetter
を使用してHandler
のRelativeSource
にコマンドをバインドします。コマンドはviewModelにあります。
<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}">
<EventSetter Event="MouseLeftButtonDown"
Handler="{Binding TextBlockMouseLeftButtonDownCommand,
RelativeSource={RelativeSource Self}}"/>
</Style>
問題は、これに何か問題があるためにエラーが発生することです(おそらく、このような簡単な方法でこれを行うことは不可能です)
私は以前に多くのことをグーグルで検索し、AttachedCommandBehaviour
を見つけましたが、スタイルでは機能しないと思います。
この問題を解決する方法についてのヒントを教えてください。
2011年10月13日更新
MVVM Light Toolkit EventToCommand
サンプルプログラムでこれを見つけました。
<Button Background="{Binding Brushes.Brush1}"
Margin="10"
Style="{StaticResource ButtonStyle}"
Content="Simple Command"
Grid.Row="1"
ToolTipService.ToolTip="Click to activate command">
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<cmd:EventToCommand Command="{Binding SimpleCommand}" />
</i:EventTrigger>
<i:EventTrigger EventName="MouseLeave">
<cmd:EventToCommand Command="{Binding ResetCommand}" />
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
しかし、ここでは、バインディングはスタイルではありません。このEventToCommand
をボタンのスタイルに配置するにはどうすればよいですか?
現在、MouseLeftButtonDown
イベントをTextBlock.TextBlockMouseLeftButtonDownCommand
にバインドしています。 TextBlockMouseLeftButtonDownCommand
はTextBlockの有効なプロパティではなく、イベントハンドラーのようにも聞こえません。
AttachedCommandBehavior を常にスタイルで使用して、コマンドをイベントに接続します。通常、構文は次のようになります(コマンドバインディングのDataContext
に注意してください)。
<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}">
<Setter Property="local:CommandBehavior.Event" Value="MouseLeftButtonDown" />
<Setter Property="local:CommandBehavior.Command"
Value="{Binding DataContext.TextBlockMouseLeftButtonDownCommand,
RelativeSource={RelativeSource Self}}" />
</Style>
別の方法は、EventSetterをコードビハインドのイベントにフックし、そこからコマンドを処理することです。
<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}">
<EventSetter Event="MouseLeftButtonDown"
Handler="TextBlockMouseLeftButtonDown"/>
</Style>
コードビハインドのイベントハンドラー...
void TextBlockMouseLeftButtonDown(object sender, MouseEventArgs e)
{
var tb = sender as TextBlock;
if (tb != null)
{
MyViewModel vm = tb.DataContext as MyViewModel;
if (vm != null && TextBlockMouseLeftButtonDownCommand != null
&& TextBlockMouseLeftButtonDownCommand.CanExecute(null))
{
vm.TextBlockMouseLeftButtonDownCommand.Execute(null)
}
}
}
MVVMを使用しているので、 Galasoft MVVM Light ToolkitEventToCommand
をお勧めします