2017-09-07 1 views
3

MVVM 프레임 워크를 사용하지 않고 WPF으로 애플리케이션을 개발했습니다. 이제이 응용 프로그램은 점점 더 커지고 있습니다. 따라서 Caliburn.Micro으로 전환하고 싶지만 이로 인해 문제가 발생합니다.RelativeSource 템플릿이있는 Caliburn.Micro DataTriggerParent

ItemsControl 안에 ListBoxes이 포함 된보기가 있습니다. ListBoxItems은 사용자가 ListBox 부모를 가리키면 불투명도를 변경해야하고 사용자가 Button (마우스가 다시이 컨트롤을 벗어날 때) 주위를 가리키면 불투명도를 변경해야하는 버튼입니다. 이를 위해,이 xaml 코드를 내놓았다 : 나는 Caliburn로 전환 한 후

<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의 코드로, 이제 더 이상 작동하지 않습니다. 이 동작의 이유는 이전에 DataTemplateItemsControl 내부에서 사용하여 뷰를 정의한 것입니다. 하지만 ItemsControl (ListBox 포함)에 바인딩 된이 항목의보기 용으로 추가 .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

현재 작동 중입니다. 그러나 : 나는 다른 버튼 (동일한 상황에서 한 번, 다른 ItemsControl에서 한 번)에 동일한 스타일을 사용하고 있기 때문에 항상 공통 조상 유형이있는 것은 아닙니다. 그것에 대해 어떤 생각? – FlashTek

+1

다른 질문입니다. 그러나 공통 조상 유형이없는 경우 두 가지 다른 트리거/다른 스타일을 정의해야합니다. 어떻게 든 데이터 트리거의 바인딩을 동적으로 변경할 수 없습니다. – mm8