【发布时间】:2013-02-08 07:15:33
【问题描述】:
基本上,我得到的是一个简单的警报消息设置。有一个单独警报的视图,其中一些数据绑定到 VM 的文本和颜色(绿色表示成功,红色表示错误等)。
<Border Margin="0 0 0 20" Background="{Binding Path=BackgroundColor}" BorderBrush="#D4D4D4" BorderThickness="1" CornerRadius="8">
<Border.Effect>
<DropShadowEffect Color="DarkGray"/>
</Border.Effect>
<Grid >
<Button Content="X" HorizontalAlignment="Left"
Margin="268,10,0,0" VerticalAlignment="Top" Width="20" RenderTransformOrigin="-0.48,0.727"/>
<TextBlock x:Name="Message"
Foreground="White" FontWeight="SemiBold" FontSize="13px"
Text="{Binding Path=Message}"
HorizontalAlignment="Left" Width="250"
TextWrapping="Wrap"
VerticalAlignment="Center" RenderTransformOrigin="-4.395,-0.038" Margin="7,13,0,25"/>
</Grid>
</Border>
目标是在您单击“X”按钮时让它们消失,并带有漂亮的淡入淡出动画。我有一个故事板来处理褪色:
<UserControl.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<BeginStoryboard>
<Storyboard>
<DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Opacity)">
<EasingDoubleKeyFrame KeyTime="0" Value="1"/>
<EasingDoubleKeyFrame KeyTime="0:0:1" Value="0"/>
</DoubleAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</UserControl.Triggers>
现在,我想做的是让 Caliburn.Micro 挂钩到情节提要的 Completed 事件,并使用一种方法来关闭实际视图(在另一个视图中有这些警报的可绑定集合,以便警报将堆叠然后根据用户的意愿被解雇)。
一开始我尝试过这样的事情,认为它与我的任何其他绑定一样工作:
<Storyboard cal:Message.Attach="[Event Completed] = [Action DismissMessage($source, $eventArgs)]">
<!-- rest of the codez... -->
但出现以下错误:
Cannot attach type "ActionMessage" to type "Storyboard". Instances of type "ActionMessage" can only be attached to objects of type "FrameworkElement".
我猜这很有意义......但是处理这种绑定的最佳方法是什么?我的思绪不可避免地开始徘徊在尝试一些 hacky 解决方案,例如从视图的代码隐藏中调用视图模型,但这似乎违反了 MVVM。
有什么建议吗?
【问题讨论】:
-
基本上,CM 的动作实现适用于基于 FrameworkElement 的元素(有充分的理由)。这里有一个关于为什么什么不起作用(任何原因)的讨论:caliburnmicro.codeplex.com/discussions/250844 - 阅读一下,它可能会给你一些见解。至于解决方法,您可能会发现自己硬着头皮将一些代码放在视图代码隐藏中。一个想法可能是使用
EventAggregator并在情节提要完成时提供一个事件,然后在 VM 中订阅此事件以关闭对话框。
标签: wpf data-binding mvvm caliburn.micro