2013-04-30 60 views
1

我使用MVVM模式編寫此major memory trainer,在屏幕上爲包含2位數字的標籤製作動畫,並要求用戶快速輸入每個數字的相應助記符。這完全取決於觀看動畫是如何完成的,因此將會有一些代碼隱藏起來。當在UI中輸入正確的助記碼或者屏幕上的號碼消失時,將從視圖中執行命令以中繼已發生的事件。可以從MVVM中的視圖訂閱ViewModel的.NET事件嗎?

在ViewModel中,我想定期觸發視圖動畫的新數字(按照它的喜好)。

實現此目的的最佳方式是什麼?我可以在ViewModel中有一個ObservableCollection <>,但我想做的不僅僅是綁定到它,我需要在添加和刪除數字時在代碼中執行一個方法。

是否符合MVVM在ViewModel中使用簡單的.NET事件,並通過以下方式訂閱它們:DataContext.NumberAdded + = new NumberAddedEventHandler(....)或者我應該採用另一種方式做它?

+0

此外,我相信你甚至不需要一個事件。您應該能夠從視圖綁定到一系列「當前挑戰」,使用「DataTemplate」渲染每個挑戰並使用觸發器處理動畫。無需事件。 – Jon 2013-04-30 12:59:34

回答

2

的視角是指收集的變化是用戶友好的ViewModel的反射。如果你有特定的視圖邏輯來運行(比如觸發一個動畫),沒有理由不使用代碼隱藏來運行它。

如果你保持你的用戶界面和數據層分離,那你很好。

也就是說,如果您只是從視圖層使用它,從ViewModel提供NumberAdded事件對我來說沒有任何意義。這是混合你的圖層。

相反,我會簡單地使用常規CollectionChanged

((MyViewModel)this.DataContext).Numbers.CollectionChanged += 
    new CollectionChangedEventHandler(....); 

根據您的收藏如何綁定到UI,你也能夠使用UI事件,或者可能觸發代替。

我想,當得到了添加或刪除的項與ItemsSource元素引發的事件,或者你可以簡單地把ItemsSource屬性到一個集合,並掛接到CollectionChanged事件出現,而無需引用MyViewModel

void SomeItemsControl_DataContextChanged(...) 
{ 
    var collection = (SomeItemsControl.ItemsSource as ObservableCollection); 
    if (collection != null) 
     collection.CollectionChanged += new CollectionChangedEventHandler(....); 
} 
+0

我想在這裏偏好的唯一的事情就像我提到有一個DP,而不是直接轉換DataContext並訂閱Numbers集合。這種方式如果綁定在將來被移除或者ViewModel被切換了,那麼你將不會有異常,並且只是看着xaml,你知道這個View有一個依賴關係,這個View需要它的DataContext。再次,這只是一個偏好,可以忽略。只是提供了一個輕微的未來證明,使視圖可以與不同的虛擬機一起使用 – Viv 2013-04-30 13:07:06

+0

@Viv是的,DP無疑是另一個很好的解決方案,特別是如果整個集合沒有被綁定到UI中的某處。 :) – Rachel 2013-04-30 13:10:22

+0

對我來說,有這樣的靈活性,可以將這個視圖附加到另一個ViewModel,而不會有太多的變化,而不是可能的綁定屬性名稱似乎超過了依賴關係訂閱:) – Viv 2013-04-30 13:12:18

1

你爲什麼認爲綁定它是不好的?

我可能會綁定到從視圖ObservableCollection<T>

在視圖中創建ObservableCollection<T>DependencyProperty並在回調的PropertyChanged訂閱該OnCollectionChanged事件,然後可以處理相應基礎上,ObservableCollection<T>在查看內容的動畫。

這樣的虛擬機剛剛更新與你提到和看法是迷上了動作,這些數字集合時的方式是希望配合

+0

唷!最後設法把它連接起來,經過長時間的編碼突破後,我變得生疏了。我喜歡這種做法。 – FreddyFlares 2013-04-30 17:23:59

+0

@FreddyFlares歡迎回來我猜:) – Viv 2013-04-30 21:40:12

0

使用Attached Behaviours將您的viewmodel屬性綁定到您需要的任何自定義行爲。

相關問題