In einem Caliburn.Micro Projekt setze ich den EventTrigger ein, um meine Commands an einem ViewModel zu binden.

Nun möchte ich gerne immer den selben EventTrigger an mehreren Stellen einsetzen und verhindern, dass der Code an “tausend” Stellen redundant eingesetzt wird. Aus diesem Grund, soll diese Interaktion als Style zu Verfügung gestellt werden.

Der folgende Code zeigt, wie der redundante Code aussehen würde:

<r:RibbonButton Label="{x:Static Helper:ViewModels.AlleKontaktGruppen}" LargeImageSource="/OCC.Resources;component/Images/32/kdm/Groups-Meeting-Dark-icon.png"> <i:Interaction.Triggers> <i:EventTrigger EventName="Click"> <cal:ActionMessage MethodName="Navigate"> <cal:Parameter Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type r:RibbonButton}, AncestorLevel=1},Path=Label}" /> </cal:ActionMessage> </i:EventTrigger> </i:Interaction.Triggers> </r:RibbonButton>

Wie gehen wir also vor? Wir leiten uns dazu eine Klasse namens “Triggers” von einer typisierten Liste des Typen System.Windows.Interactivity.TriggerBase ab und registrieren diese als DepedencyProperty:

using System.Collections.Generic; using System.Windows; using System.Windows.Interactivity; namespace OCC.WPF.Helper { public class Triggers : List<System.Windows.Interactivity.TriggerBase> { } public static class OCCInteraction { public static Triggers GetTriggers(DependencyObject obj) { return (Triggers)obj.GetValue(TriggersProperty); } public static void SetTriggers(DependencyObject obj, Triggers value) { obj.SetValue(TriggersProperty, value); } public static readonly DependencyProperty TriggersProperty = DependencyProperty.RegisterAttached("Triggers", typeof(Triggers), typeof(OCCInteraction), new UIPropertyMetadata(null, OnPropertyTriggersChanged)); private static void OnPropertyTriggersChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { var triggers = Interaction.GetTriggers(d); foreach (var trigger in e.NewValue as Triggers) triggers.Add(trigger); } } }

Und in einem Ressourcenwörterbuch “Style.xaml” bauen wir uns den entsprechenden Trigger dann in zusammen:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Helper="clr-namespace:OCC.WPF.Helper" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:cal="http://www.caliburnproject.org" xmlns:Ribbon="clr-namespace:Microsoft.Windows.Controls.Ribbon;assembly=RibbonControlsLibrary"> <Helper:Triggers x:Key="ribbonBtnClickTrigger" x:Shared="False"> <i:EventTrigger EventName="Click"> <cal:ActionMessage MethodName="Navigate"> <cal:Parameter Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Ribbon:RibbonButton}, AncestorLevel=1},Path=Label}" /> </cal:ActionMessage> </i:EventTrigger> </Helper:Triggers> <Style x:Key="ribbonBtnClickBehavior" TargetType="FrameworkElement"> <Setter Property="Helper:OCCInteraction.Triggers" Value="{StaticResource ribbonBtnClickTrigger}"/> </Style> </ResourceDictionary>

Anschließend können wir unser Element an das Style-Attribute binden:

<r:RibbonButton Label="{x:Static Helper:ViewModelNames.AlleKontaktGruppen}" LargeImageSource="/OCC.Resources;component/Images/32/kdm/Groups-Meeting-Dark-icon.png" Style="{StaticResource ribbonBtnClickBehavior}"/>

Sieht doch gleich viel besser aus.

Viel Spaß beim entwickeln : )

Interaction Event-Trigger als Style auslagern
Markiert in: