2011-11-04 53 views
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會每次綁定到內容展示者時都必須觸發某個事件,並且視圖必須響應該事件)。有沒有一種方法可以在我的視圖模型中聲明某種類型的基本類型,比如布爾值,它可以綁定到布爾值的xaml標記中?

在此先感謝任何人可能有的想法,如果已經提出此問題,則表示感謝。我發現了一些類似的帖子,但沒有什麼比我想要的更好。

更新 - 發現的解決方案

事實證明(至少我目前擁有的實現),這是解決比我認識一個更容易的問題。如果使用數據模板模式構建視圖(即爲資源字典中的每個視圖模型定義數據模板,然後將該資源字典添加到app.xaml文件的資源列表中),則每次都會重新創建該視圖它從內容控件中刪除。就我而言,每次我將內容控件的內容綁定到與上一個不同的視圖模型時,實際上都會處理該視圖模型「構建」的視圖。然後,當視圖模型再次被重新分配給內容控制時,視圖將重新構建。因此,我可以將視屏XAML的Loaded事件和視圖XAML的UnLoaded事件中的屏幕動畫放入屏幕動畫中。

我想分享這個以防其他人面臨類似的問題 - 我不知道這種類型的行爲使用數據模板來顯示視圖模型的視圖。

回答

1

這取決於你以後的動畫。例如,如果您想滑出當前視圖然後滑入下一個視圖,則可以簡單地讓您的控制視圖模型引發兩個事件:CurrentContentViewModelChangingCurrentContentViewModelChanged。您的視圖可以基於這些事件觸發適當的動畫。但是,如果您的動畫需要在舊視圖的同一時間顯示新視圖,則事情會變得有點棘手。您或者需要在新視圖的同時顯示舊視圖,或者需要您的視圖在新視圖被替換之前拍攝舊視圖的快照。同樣,您應該能夠使用相同的事件做到這一點。

+0

感謝您的建議肯特!在進行關於MVVM的發現之前,我正在研究這些以及其他一些建議,以及Data Templates如何真正起作用,這真正簡化了我的問題。該信息在下面發佈。 – Codine

+0

沒關係,顯然我無法在發佈後的8小時內回答我自己的問題......我將編輯我的原始問題。 – Codine