Ich entwickelte eine Anwendung mit WPF
ohne ein spezielles MVVM
Framework zu verwenden. Jetzt wird diese Anwendung immer größer; Daher möchte ich zu Caliburn.Micro
wechseln, aber das verursacht einige Probleme.Caliburn.Micro DataTrigger mit RelativeSource TemplateedParent
Ich habe eine Ansicht mit ListBoxes
in einem ItemsControl
. In der ListBoxItems
ist ein Knopf platziert, der die Deckkraft ändern muss, sobald der Benutzer über den Eltern ListBox
schwebt und noch einmal, wenn der Benutzer über die Button
selbst schwebt (und den Weg herum, wenn die Maus diese Steuerelemente wieder verlässt). Um dies zu erreichen, kam ich mit diesem xaml
Code oben:
<Style x:Key="DeleteButtonStyle" TargetType="Button">
<Setter Property="Opacity" Value="0.0" />
<Style.Triggers>
<EventTrigger RoutedEvent="Control.MouseEnter">
<RemoveStoryboard BeginStoryboardName="PartiallyFadeOutStoryboard" />
<RemoveStoryboard BeginStoryboardName="FadeOutStoryboard" />
<BeginStoryboard Storyboard="{StaticResource FadeInStoryboard}" x:Name="FadeInStoryboard"/>
</EventTrigger>
<EventTrigger RoutedEvent="Control.MouseLeave">
<RemoveStoryboard BeginStoryboardName="PartiallyFadeInStoryboard" />
<RemoveStoryboard BeginStoryboardName="FadeInStoryboard" />
<BeginStoryboard Storyboard="{StaticResource PartiallyFadeOutStoryboard}" x:Name="PartiallyFadeOutStoryboard"/>
</EventTrigger>
<DataTrigger Binding="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsMouseOver, NotifyOnSourceUpdated=True}" Value="True">
<DataTrigger.EnterActions>
<RemoveStoryboard BeginStoryboardName="PartiallyFadeOutStoryboard" />
<RemoveStoryboard BeginStoryboardName="FadeOutStoryboard" />
<BeginStoryboard Storyboard="{StaticResource PartiallyFadeInStoryboard}" x:Name="PartiallyFadeInStoryboard"/>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<RemoveStoryboard BeginStoryboardName="PartiallyFadeInStoryboard" />
<RemoveStoryboard BeginStoryboardName="FadeInStoryboard" />
<RemoveStoryboard BeginStoryboardName="PartiallyFadeOutStoryboard" />
<BeginStoryboard Storyboard="{StaticResource FadeOutStoryboard}" x:Name="FadeOutStoryboard"/>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
Leider ist dies nun, nachdem ich Caliburn geschaltet, nicht mehr arbeiten, wie der Code der letzten DataTrigger
wird nicht mehr ausgeführt. Ich denke, der Grund für dieses Verhalten ist, dass ich zuvor eine DataTemplate
innerhalb der ItemsControl
verwendet, um die Ansicht zu definieren; aber jetzt habe ich eine extra .xaml
Datei/Klasse nur für die Ansicht dieser Artikel erstellt, die an die ItemsControl
(die die ListBox
enthält) gebunden - daher funktioniert die RelativeSource TemplatedParent
möglicherweise nicht mehr. Ist diese Idee richtig? Wie kann ich dieses Problem auf die eleganteste Weise lösen?
Dies funktioniert. Aber: Ich verwende den gleichen Stil für verschiedene Schaltflächen (einmal in der oben beschriebenen Situation und einmal in einem anderen 'ItemsControl'), so dass sie nicht immer einen gemeinsamen Vorläufertyp haben. Irgendeine Idee dazu? – FlashTek
Das ist eine andere Frage. Wenn sie jedoch keinen gemeinsamen Vorfahrentyp haben, müssen Sie zwei verschiedene Auslöser/verschiedene Stile definieren. Sie können die Bindung des Datenauslösers nicht dynamisch ändern. – mm8