Caliburn.Micro DataTrigger与RelativeSource TemplatedParent的搭配

4
我使用WPF开发了一个应用程序,没有使用特殊的MVVM框架。现在这个应用程序越来越大,因此我想切换到Caliburn.Micro,但是这会导致一些问题。
我的视图包含ItemsControl中的ListBoxes。在ListBoxItems中放置了一个按钮,当用户悬停在父ListBox上时,按钮必须改变不透明度,再次悬停在按钮本身上时也是如此(当鼠标再次离开这些控件时,情况相反)。为了实现这一点,我想出了以下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>

可惜的是,我转换到Caliburn之后,这个功能不再起作用了,因为最后一个的代码不再被执行。我认为这种行为的原因是我之前在ItemsControl中使用DataTemplate来定义视图;但现在我创建了一个额外的.xaml文件/类专门用于这些绑定到ItemsControl(包含ListBox)的项的视图 - 因此,RelativeSource TemplatedParent可能不再起作用。这个想法正确吗?我该如何以最优雅的方式解决这个问题?

1个回答

2
尝试使用{RelativeSource}AncestorType进行相关操作:
<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>

将后者更改为您尝试绑定的任何父元素的类型。

1
这个是有效的。但是:我在不同的按钮上使用相同的样式(一次是在上述情况下,另一次是在另一个“ItemsControl”中),因此它们并不总是有共同的祖先类型。你有什么想法吗? - zimmerrol
2
那是另一个问题。但如果它们没有共同的祖先类型,您将需要定义两个不同的触发器/不同的样式。您无法以某种方式动态更改数据触发器的绑定。 - mm8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接