2017-11-20 3 views
0

Ich habe eine Sicht, wo ich die gesamte Navigation der Anwendung handhabe. Jetzt möchte ich ein EventTrigger zu allen Kontrollen des Typs <vw:NavigationRadioButton/>Anwenden von Interaction EventTrigger für jedes Steuerelement des Typs in einer Ansicht

<vw:NavigationRadioButton Text="Frisse Conche" RegionName="MainRegion" ViewName="PanoramaFrisse"> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="PreviewMouseDown"> 
     <i:InvokeCommandAction Command="{Binding Path=CheckRecipeChangedCommand, Source={vw:AdapterBinding RecipeAdapter}}" CommandParameter="MainRegion;PanoramaFrisse"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</vw:NavigationRadioButton> 

auch hinzufügen, wenn das ist möglich: Ich habe den Wert der Immobilien RegionName und ViewName zu meinem Kommando übergeben werden soll (wie ich manuell in diesem Beispiel tat)

Wenn das möglich ist, wie kann ich das erreichen?

+0

* "Hinzufügen ... zu allen Steuerelementen des Typs" * = Stil mit 'TargetType'. Niemals Blend verwendet. – Sinatr

+0

@Sinatr Unglücklicherweise sind 'Interaction.Behaviors' und' Interaction.Triggers' Sammlungen nicht innerhalb von 'Style' verwendbar, da sie schreibgeschützte Eigenschaften sind (dasselbe Problem gibt es zum Beispiel für' Grid.ColumnDefinitions'). – Grx70

+0

@ Grx70, [machbar] (https://stackoverflow.com/q/22321966/1997232). – Sinatr

Antwort

0

Übliche Lösung für diese Art von Problemen ist die Verwendung einer ordnungsgemäßen (normalerweise implizit) Style. Leider ist es nicht möglich, Interaction.Behaviors oder Interaction.Triggers Sammlungen über einen Stil zu bevölkern. Zumindest nicht direkt, obwohl es einige Workarounds gibt, wie zB this one, die @Sinatr in seinem Kommentar erwähnt.

Meiner Meinung nach aber eine bessere Lösung ist dedizierte Hilfsklasse mit einem daran befestigten Eigenschaft zu erstellen, mit dem Sie zwei Vögel können zusätzlich mit einer Klappe schlagen und richtigen Parameter an den Befehl übergeben:

public static class NavigationRadioButtonHelper 
{ 
    public static readonly DependencyProperty CommandProperty = 
     DependencyProperty.RegisterAttached(
      name: "Command", 
      propertyType: typeof(ICommand), 
      ownerType: typeof(NavigationRadioButtonHelper), 
      defaultMetadata: new PropertyMetadata(null, HandleCommandChanged)); 

    public static ICommand GetCommand(NavigationRadioButton control) 
     => (ICommand)control.GetValue(CommandProperty); 

    public static void SetCommand(NavigationRadioButton control, ICommand value) 
     => control.SetValue(CommandProperty, value); 

    private static void HandleCommandChanged(
     DependencyObject d, 
     DependencyPropertyChangedEventArgs e) 
    { 
     if (e.NewValue != null) 
     { 
      ((NavigationRadioButton)d).AddHandler(
       routedEvent: Mouse.PreviewMouseDownEvent, 
       handler: (MouseButtonEventHandler)HandlePreviewMouseDown); 
     } 
     else 
     { 
      ((NavigationRadioButton)d).RemoveHandler(
       routedEvent: Mouse.PreviewMouseDownEvent, 
       handler: (MouseButtonEventHandler)HandlePreviewMouseDown); 
     } 
    } 

    private static void HandlePreviewMouseDown(object sender, MouseButtonEventArgs e) 
    { 
     var control = (NavigationRadioButton)sender; 
     var command = GetCommand(control); 
     var parameter = $"{control.RegionName},{control.ViewName}"; 
     if (command != null && command.CanExecute(parameter)) 
      command.Execute(parameter); 
    } 
} 

Was passiert hier, wenn der Eigenschaft ein Befehl zugewiesen wird, wird ein Handler für das Mouse.PreviewMouseDownEvent zu dem zugehörigen Objekt hinzugefügt, das einfach den angehängten Befehl ausführt, wodurch bequem der erforderliche Parameter zur gleichen Zeit konstruiert wird. Wenn der Befehl auf null festgelegt ist, wird der Handler entfernt. Und da diese Funktionalität nur auf einem einzigen beigefügten Abhängigkeitseigenschaft beruht, kann es leicht mit einem Stil in Kombination verwendet werden:

<Style TargetType="{x:Type vw:NavigationRadioButton}"> 
    <Setter Property="ns:NavigationRadioButtonHelper.Command" Value="{Binding (...)}" /> 
</Style> 

ich Sie gehe davon haben nicht die Macht, die NavigationRadioButton Klasse zu ändern, wobei in diesem Fall Diese Logik könnte innerhalb dieser Klasse ohne die Notwendigkeit einer Hilfsklasse integriert werden.


Sammlungen der Regel nicht über eine Art bestückt werden kann, nur zugeordnet. Keine der beiden Eigenschaften ist öffentlich zugänglich, und entsprechende Setter-Methoden sind nicht öffentlich verfügbar und können als solche in dem Sinne als schreibgeschützt betrachtet werden, dass ihre Werte nicht zugewiesen, sondern nur modifiziert werden können.

Verwandte Themen