web-dev-qa-db-ja.com

スタイルのwpfイベントセッターハンドラーバインディング

スタイルがあり、EventSetterを使用してHandlerRelativeSourceにコマンドをバインドします。コマンドは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をボタンのスタイルに配置するにはどうすればよいですか?

20
Zoltán Barna

現在、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)
        }
    }
}
25
Rachel

MVVMを使用しているので、 Galasoft MVVM Light ToolkitEventToCommand をお勧めします

3
Philippe Lavoie

私の答え on この質問 は、外部ツールキット/ライブラリなしでトリックを行います。ただし、RelativeSourceは使用せず、100%MVVMではありません。コードビハインドイベントハンドラーに1行のコードが必要です。

0
Micah Vertal