【问题标题】:Caliburn.Micro DataTrigger with RelativeSource TemplatedParent带有 RelativeSource TemplatedParent 的 Caliburn.Micro DataTrigger
【发布时间】:2018-02-15 20:24:14
【问题描述】:

我使用WPF 开发了一个应用程序,而没有使用特殊的MVVM 框架。现在这个应用越来越大了;因此,我想切换到Caliburn.Micro,但这会导致一些问题。

我有一个在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>

可悲的是,现在,在我切换到 Caliburn 之后,不再工作,因为最后一个 DataTrigger 的代码不再执行。我认为这种行为的原因是我之前在ItemsControl 中使用了DataTemplate 来定义视图;但是现在我创建了一个额外的.xaml 文件/类,只是为了查看绑定到ItemsControl(其中包含ListBox)的这些项目——因此,RelativeSource TemplatedParent 可能不再工作了。这个想法正确吗?我怎样才能以最优雅的方式解决这个问题?

【问题讨论】:

    标签: wpf xaml mvvm caliburn.micro caliburn


    【解决方案1】:

    尝试使用{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>
    

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

    【讨论】:

    • 这是有效的。但是:我对不同的按钮使用相同的样式(一次在上述情况下,一次在另一个ItemsControl),因此它们并不总是具有共同的祖先类型。有什么想法吗?
    • 那是另一个问题。但是如果它们没有共同的祖先类型,您将需要定义两个不同的触发器/不同的样式。您不能以某种方式动态更改数据触发器的绑定。
    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 2011-09-11
    • 1970-01-01
    • 2015-04-22
    • 2017-08-15
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多