2017-09-07 24 views
3

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?

Antwort

1

Versuchen Sie, eine {RelativeSource} mit einem AncestorType zu verwenden:

<DataTrigger Binding="{Binding RelativeSource={RelativeSource AncestorType=ListBoxItem}, Path=IsMouseOver}" 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> 

ändern letztere auf die Art der alles, was Eltern-Element Sie versuchen, zu binden.

+0

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

+1

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