2009-12-31 51 views
3

我目前正在使用MVVM /命令和控件模板。 我想要做的事很簡單。我想要列出一個例如人員,用戶可以觸發他們每個人的行動。 但是事件/命令處理程序需要在人員對象上執行,例如因爲我想用按鈕從列表中刪除它。MVVM /命令和控件模板

所以我到目前爲止所做的是創建一個虛擬機,公開一個PersonVM列表以及每個持有我的人員對象的虛擬機。然後我用一個包含一個ItemsControl的控件模板創建一個CustomControl來顯示我的人物。

所有的數據都很好地顯示,沒有問題。

然後我嘗試添加允許用戶從列表中刪除某個人的部分。 所以我在數據模板上添加了一個按鈕。仍然沒有問題。

下一步是暴露由按鈕觸發的命令。

第一種方法是使用Josh Smiths RelayCommand。所以我將其中的一個添加到PersonViewModel並將其綁定到按鈕。 它的工作原理,但問題是我需要引發父虛擬機必須處理的事件(在命令執行後)。 Imho不好,就像越來越多的命令一樣,代碼對我來說似乎很混亂。

因此,我重寫了所有使用RoutedCommand,並試圖在控制層次結構中的更高級別添加CommandBinding。但這是不可能的,因爲ControlTemplate不允許我在視圖模型上調用方法。

所以我想知道這個問題的正確方法是什麼?不知何故,我相信我走錯了路,但我不知道在哪裏。

TIA 馬丁

回答

2

事情我已經做了這樣的作品,如果可能有點亂,是用的RelativeSource綁定走的DataContext(或命令綁定)備份邏輯樹,一拉:

Command="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.MyCommandOnTheViewModel}" 
+0

我的主要模型是不公開命令,我的孩子虛擬現實是暴露它,因此這不適用於我的情況。 – 2010-01-05 07:47:23

0

當我使用MVVM模式傳遞事件時,發現Prism’s Event Aggregator非常有用。它允許你處理鬆散耦合的通信。

因此,一般來說,如果我想通過沒有明確關係的視圖模型傳遞類似於刪除的事件,我將訂閱一個視圖模型以查找特定的事件聚合,然後從適當的地方。

我確定有這種方法的幾種變體,所以它可能值得一看?

+0

不錯的做法,但我需要更多,因爲imho CommandBindings完全是爲我的目的而設計的... – 2010-01-05 07:51:21