0

我正在尝试真正遵守 MVVM 模式,因此我很难弄清楚如何在每次设置视图模型上的某些属性时(通过绑定)让视图上的动画触发。

在我的 MainWindow.xaml 中,我有一个 ContentPresenter,我将该演示者的内容绑定到向用户显示的当前视图的视图模型。例如,当用户第一次运行应用程序时,ContentPresenter 将绑定到 StartViewModel。例如,如果用户单击将他/她带到不同屏幕以运行研究的按钮,则需要将 ContentPresenter 绑定到 StudyViewModel 以便显示 StudyView 屏幕。然后,如果用户希望返回到起始屏幕,此时的 ContentPresenter 将再次绑定到应用程序启动时创建的 StartViewModel。它看起来像这样:

<Window
...
  <Grid
  ...
        <ContentControl
            x:Name="CurrentContentView"
            Width="Auto"
            Grid.Row="2" 
            Content="{Binding CurrentContentViewModel}" />
  </Grid>
</Window>

CurrentContentViewModel 属于“ViewModelBase”类型,它是我为所有实现 INotifyPropertyChanged 的​​视图模型创建的基类。我在幕后保留 ViewModelBase 的 ObservableCollection ,每次发生一些应该导致用户转到新屏幕的事件时,我都会在该集合中查找适当的视图模型并将 CurrentContentViewModel 设置为该视图模型。如果它在我的集合中尚不存在,我首先将其添加到集合中,然后将 CurrentContentViewModel 设置为该视图模型。

我的问题是:如何让我的视图在每次显示视图时运行“介绍”动画?我无法将情节提要设置为每次在我的 ContentPresenter 中简单地加载视图时运行,因为我还想在用户返回到应用程序生命周期中先前已加载的视图时再次运行动画。最重要的是,我的视图是“愚蠢的”并且不知道它再次显示在 MainWindow 中,因为我的 MainWindow 上的 ContentPresenter 绑定到视图模型而不是视图(所以它几乎就像 VIEW MODEL 会每次绑定到内容呈现器时都必须触发某个事件,并且视图必须响应该事件)。

提前感谢任何人可能有的任何想法,如果这个问题已经被问到,我们很抱歉。我发现了一些类似的帖子,但与我想要做的完全不同。

更新 - 找到解决方案

事实证明(至少在我目前的实现中),这是一个比我意识到的更容易解决的问题。如果您使用数据模板模式构建视图(即在资源字典中为每个视图模型定义数据模板,然后将该资源字典添加到 app.xaml 文件的资源列表中),则每次都会重新创建视图它从内容控件中删除。就我而言,每次我将我的内容控件的内容绑定到与前一个不同的视图模型时,为该视图模型“构建”的视图实际上会被释放。然后,当视图模型再次重新分配给内容控件时,视图将重新构建。因此,我可以将我的屏幕介绍动画放在视图的 Loaded 事件中

我想分享这个,以防其他人面临类似的问题——我不知道这种使用数据模板来显示视图模型视图的行为。

4

1 回答 1

1

这取决于您所追求的动画。例如,如果您想滑出当前视图然后滑入下一个视图,您可以简单地让您的控制视图模型引发两个事件:CurrentContentViewModelChangingCurrentContentViewModelChanged. 您的视图可以根据这些事件触发适当的动画。

但是,如果您的动画需要在显示旧视图的同时显示新视图,事情就会变得有些棘手。您要么需要在新视图的同时公开旧视图,要么需要在新视图被替换之前让视图拍摄旧视图的快照。同样,您应该能够使用相同的事件来实现这一点。

于 2011-11-04T18:17:43.343 回答