2009-07-27 9 views
0

Oft Antworten hier gefunden, aber jetzt es `s mein erstes Mal;)Button: verschiedene DelegateCommands Bindung je nach Clickmode-Wert (Press/Release)

Wir verwenden das MVVM Muster in Verbindung mit DelegateCommands. Also normalerweise band ich einen Befehl an die Schaltfläche wie folgen aus:

<Button Command="{Binding SetXYZActivatedCommand}" /> 

Ich muß verschiedene Befehle ausführen, wenn die Taste gedrückt wird und wenn die Taste wieder losgelassen wird. Meine Idee war folgende:

<Button Grid.Row="3" x:Name="TestButtonObj" Content="asdlknm"> 
    <Button.Template> 
     <ControlTemplate TargetType="{x:Type Button}"> 
      <Border x:Name="border" CornerRadius="80" Background="LightBlue"> 
       <ContentPresenter Name="content" HorizontalAlignment="Center" VerticalAlignment="Center"/> 
      </Border> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsPressed" Value="True"> 
       <Setter TargetName="border" Property="Background" Value="Aqua" /> 
       <Setter TargetName="content" Property="Content" Value="Pressed" /> 
       </Trigger> 
       <Trigger Property="ClickMode" Value="Press"> 
       <Setter TargetName="TestButtonObj" Property="Command" Value="{Binding SetPttDeactivatedCommand}" /> 
       </Trigger> 
       <Trigger Property="ClickMode" Value="Release"> 
       <Setter Property="Button.Command" Value="{Binding SetPttActivatedCommand}" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Button.Template> 
</Button> 

Das Problem ist, dass TestButtonObj unbekannt ist. Ok ich habe akzeptiert, dass ich nicht auf das übergeordnete Objekt zugreifen kann. Ohne TargetName = "TestButtonObj" kompiliert es, aber der Befehl wird nicht ausgeführt. Mhhhh ...

Ok habe ich versucht, die folgenden, aber es kann nicht funktionieren ... Command ist kein Abhängigkeitseigenschaft (hoffentlich erhalten Sie mich aus diesem Labyrinth)

<Button Grid.Row="2" Content="CommandBindings"> 
<Button.CommandBindings> 
    <CommandBinding Command="{Binding SetPttActivatedCommand}" /> 
</Button.CommandBindings> 

Auf diese Punkt, ich steckte. Ich weiß nicht, ob der Weg völlig falsch war. Ich lese den ganzen Tag über Befehle und Bindung, aber ich verstehe nicht. Ich hoffe, jemand kann mir den Weg zeigen.

Ich postete auch heute Morgen hier: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/cc68b10c-4e1c-4344-9f00-710185d4b1b0 Wenn ich eine Antwort bekomme, werde ich es hier auch posten.

Vielen Dank (im Voraus), Totti

Antwort

1

Sie sollten die AttachedCommandBehavior Bibliothek verwenden. Es ermöglicht Ihnen, mehrere Befehle an die gleiche Steuerung zu binden:

<Button Grid.Row="3" x:Name="TestButtonObj" Content="asdlknm"> 
    <local:CommandBehaviorCollection.Behaviors> 
    <local:BehaviorBinding Event="MouseLeftButtonDown" Action="{Binding SetPttDeactivatedCommand}" /> 
    <local:BehaviorBinding Event="MouseLeftButtonUp" Command="{Binding SetPttActivatedCommand}" /> 
    ... 
    </local:CommandBehaviorCollection.Behaviors> 
</Button> 
+0

Danke, sieht gut aus Hoffentlich habe ich morgen die Zeit, ein bisschen mehr zu recherchieren ... Übrigens habe ich keine Lizenzinformation gesehen: Können wir es benutzen? in einer kommerziellen App? – TottiW

+0

Ich glaube nicht, dass es eine Lizenz gibt. Der Autor sagt: "Dieser Code wurde nicht oft getestet, also erwarten Sie Bugs etc ... Wenn Sie dies in Produktionscode verwenden möchten, tun Sie dies auf eigene Gefahr" –

+0

Ich weiß nicht, was Ihr ultimatives Ziel ist, aber Wenn Sie eine Aktion so lange ausführen möchten, wie die Schaltfläche gedrückt wird, sollten Sie sich den ReapeatButton ansehen, der kontinuierlich ein Klickereignis auslöst, solange er gedrückt wird. –

0

Haben Sie versucht, den Namen in der Bindung zu setzen?

<Setter Property="Command" Value="{Binding ElementName=TestButtonObj, Path=SetPttDeactivatedCommand}" /> 
+0

Jetzt habe ich versucht, es - aber ohne Erfolg :( Doesn 't sogar stoppen an der Unterbrechungsstelle von: öffentlichen ICommand SetPttDeactivetedCommant wo die DelegateCommand sollte instanziiert werden – TottiW

+0

Überprüfen Sie, ob die Bindung Zwei-Wege ist.Andern als das, vielleicht arbeiten Setter nicht mit benannten Elementen außerhalb der Vorlage ... –

+0

Die TwoWay-Bindung war nicht das Problem.Aber wie auch immer, danke für den Versuch zu helfen – TottiW

Verwandte Themen