【问题标题】:How to know when an animation has finished in my ViewModel?如何知道我的 ViewModel 中的动画何时完成?
【发布时间】:2012-02-20 07:24:05
【问题描述】:

我正在寻找一个可以告诉我动画何时结束的依赖属性。通过设置属性“IsDirty”让视图知道它应该为背景设置动画,但我需要为下一次更改重置值。

我希望你明白我的意思。

编辑:为了显示我正在使用情节提要的闪光灯。

【问题讨论】:

  • by setting a property "Value Changed" 这是滥用,如果你有一个事件,触发一个事件,“值改变”不是一个属性。
  • @H.B:如果属性被称为“IsDirty”或“IsValueDirty”这两个通用标准,你会感觉更舒服吗?
  • 这将是一个完全不同(并且可以接受)的事情,如果它实际上是这样使用的。但是,您的描述听起来不像那样,正确的 IsDirty 不会被动画完成清除。
  • @H.B:好的,所以你得到一个名为 IsDirty 的属性来存储值已更改。你什么时候重置它?在我的情况下,一个值是脏的,因为它已经改变并且用户没有意识到这个改变。动画结束后,值不再脏,因为“脏”的原因不再存在,我需要重置属性。关于如何做到这一点的任何想法?我迷路了。
  • 这完全取决于您如何“显示闪光灯(背景更改)”。如果您使用的是 StoryBoard,那么您可以处理一个 Completed 事件并设置您的属性。

标签: .net wpf animation mvvm


【解决方案1】:

您可以为StoryBoard 处理Completed event 并在该时间点设置任何通知。我知道您想避免代码落后,但我认为在这种情况下将需要它,因为 StoryBoard 上没有这样的依赖属性,用于“IsComplete”,您可以使用它进行数据绑定。

【讨论】:

  • 对附加属性做些什么?我仍然不确定何时使用它们。我可以使用 on 来扩展 Storyboard 并绑定到它吗?
  • 当然,您可以尝试使用附加属性来模拟故事板的 IsComplete - 但这将涉及更多代码,然后编写事件处理程序。
  • 事实上,我有很多带有闪光的物品。如果我可以绑定该属性,那么为每个 Completed 事件编码的代码将会少得多。然后我将看看附加属性。你确定它是可行的?
  • 检查这个 - stackoverflow.com/questions/1444252/… - 看起来是可能的,甚至有一些链接代码可以做到这一点。
  • 正是我所需要的,你摇滚。
【解决方案2】:

你不知道,也不应该这样做。

视图模型应该不知道视图*,更不用说视图完成执行动画的时候了。虚拟机拥有IsDirty 属性绝对没问题,视图的作用取决于它,虚拟机不需要知道它。但是,您应该检查您对该标志的使用 - 常见用途是指示数据处于已更改且未保存的状态,当您的 UI 动画完成时,VM 仍处于脏状态,因此您不应使用此标志来切换每次数据更改时的动画(改用常规的PropertyChanged 事件)。

编辑:
以下是对评论的更多澄清。

IsDirty 表示应通知用户有关更改。

可以通过多种方式通知用户数据已更改。这可以是一次性事件,例如状态区域中的图标、UI 闪存等。IsDirty 标志只能由 VM 重置,因为 VM 知道何时保存更改的数据。该视图为您提供了一个按钮(或其他)来触发保存机制,它实际上并不知道数据何时(或是否)实际已保存,因此视图不应重置该标志。您不需要视图来指示通知已完成 - 您可以在动画发生时禁用保存按钮或其他 UI 元素,以防止用户与数据交互。

如果你想每次在数据发生变化时通知,那么实现上面提到的INotifyPropertyChanged接口,可以通过VM上的接口暴露PropertyChanged事件,然后视图就可以订阅了到它,你可以触发你感兴趣的任何属性变化的动画。你需要小心地限制它 - 你不想因为快速的属性变化而对动画发疯。

*我还没有看到虚拟机知道并能够操纵或响应视图的有效用途。很多人都这样做,但正是糟糕的设计迫使他们采用这种方法。

【讨论】:

  • 我知道你的意思,但我可能写的问题太快太简单了。我同意,VM 对视图一无所知。 IsDirty 表示应通知用户有关更改。一旦用户收到 View 的通知(但是),我知道 View 应该通过 Binding 重置 IsDirty 属性(这就是我正在寻找的,一个告诉我动画何时结束的 dp)。这样 View 对 VM 的了解就更少了,对吧?
  • 我认为将属性命名为 IsDirty 会让您感到困惑。我使用该值指定应通知用户更改,而不是保存更改。 ViewModel 不知道 View,因此它无法知道用户是否已收到通知。
  • 您是否考虑在视图模型上执行命令以通知动画操作已完成作为可接受的替代方案?
  • 我的意思是,Views 和 ViewModels 通过 Bindings 不断对话,这就是我想要进行这种交流的方式。
  • @Reddog - 不,我不会,因为这与设置依赖属性并绑定到视图模型上的目标属性没有什么不同。我的观点是,虽然可以做 OP 想要的事情,但他实际上最好使用从 VM 到 V 的单向事件来实现他想要的,他正在考虑的是一个大的反模式或违反 MVVM . IOW,我们可以向 OP 展示如何跳下悬崖,但我们真的应该向他展示一种更好的方法来到达悬崖底部。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多