Frage wpf Eventsetter-Handler-Bindung im Stil


Ich habe einen Stil, und ich möchte einen Befehl an die EventSetterist es Handler mit RelativeSource. Der Befehl befindet sich im ViewModel.

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}">
    <EventSetter Event="MouseLeftButtonDown" 
                 Handler="{Binding TextBlockMouseLeftButtonDownCommand, 
                           RelativeSource={RelativeSource Self}}"/>
</Style>

Das Problem ist, dass ich einen Fehler bekomme, weil etwas damit nicht stimmt (vielleicht ist es nicht so einfach möglich)

Ich habe schon viel gegooglet, und ich habe das gefunden AttachedCommandBehaviour, aber ich denke, es funktioniert nicht mit Stil.

Könnten Sie einige Hinweise geben, wie Sie dieses Problem lösen können?

Update 13.10.2011

Ich habe das im MVVM Light Toolkit gefunden EventToCommand Beispielprogramm:

        <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>

Aber hier ist die Bindung nicht im Stil. Wie kann ich das sagen? EventToCommand zum Stil des Knopfes?


16
2017-10-13 13:40


Ursprung


Antworten:


Gerade jetzt binden Sie die MouseLeftButtonDown Veranstaltung zu TextBlock.TextBlockMouseLeftButtonDownCommand. TextBlockMouseLeftButtonDownCommand ist keine gültige Eigenschaft für einen TextBlock, noch klingt es wie ein Event Handler.

Ich verwende das AttachedCommandBehavior die ganze Zeit in Stilen für den Anschluss eines Befehls an ein Ereignis. Die Syntax sieht normalerweise so aus (beachten Sie die DataContextin der Befehlsbindung):

<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>

Die Alternative besteht darin, den EventSetter an ein Ereignis im Code-Behind anzuhängen und den Befehl von dort zu verarbeiten:

<Style x:Key="ItemTextBlockEventSetterStyle" TargetType="{x:Type TextBlock}">
    <EventSetter Event="MouseLeftButtonDown" 
                 Handler="TextBlockMouseLeftButtonDown"/>
</Style>

Ereignishandler im Code hinter ...

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)
        }
    }
}

21
2017-10-13 15:46



Da Sie MVVM verwenden, empfehle ich Ihnen Galasoft MVVM Light Toolkit  EventToCommand


3
2017-10-13 13:45



Meine Antwort auf diese Frage macht den Trick ohne externe Tool-Kits / Bibliotheken. Es wird jedoch nicht verwendet RelativeSourceund es ist nicht 100% MVVM. Es erfordert eine Codezeile in einem Code-Behind-Ereignishandler.


0
2017-12-13 15:01