2017-09-07 6 views
3

MVVMフレームワークを使用せずにWPFのアプリケーションを開発しました。今、このアプリケーションはますます大きくなっています。したがって、Caliburn.Microに切り替える必要がありますが、これによって問題が発生します。RelativeSourceを持つCaliburn.Micro DataTrigger TemplatedParent

ItemsControlの中にListBoxesを含むビューがあります。 ListBoxItemsは、ユーザーがListBoxの上に移動すると不透明度を変更し、再びユーザーがButton(およびマウスがこれらのコントロールから再び離れるときの途中)を移動すると、ボタンを配置するボタンです。これを達成するために、私はこのxamlコードを思い付いた:私はカリバーンに切り替えた後

<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> 

悲しいことに、これはもう実行されていない最後のDataTriggerのコードとして、今、これ以上の作業ではありません。私はこの動作の理由は、以前はをItemsControlの内部で使用してビューを定義していたためです。今度は、ItemsControlListBoxを含む)にバインドされているこのアイテムのビューのためだけに、.xamlファイル/クラスを作成しました。したがって、RelativeSource TemplatedParentはもう機能していない可能性があります。このアイデアは正しいですか?どのように私は最もエレガントな方法でこの問題を解決することができますか?

答えて

1

AncestorType{RelativeSource}を使用してみてください:

<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> 

あなたがにバインドしようとするものは何でも親要素の種類に後者変更。

+0

これは機能しています。しかし:私は同じスタイルを異なるボタンに使用しています(上記の状況では1回、別の 'ItemsControl'では1回)、共通の祖先型を持つとは限りません。それについてのアイデア? – FlashTek

+1

それは別の質問です。しかし、共通の祖先型がない場合は、2つの異なるトリガー/異なるスタイルを定義する必要があります。データトリガーのバインディングを何らかの形で動的に変更することはできません。 – mm8

関連する問題