2011-01-11 70 views
5

alt text從集合中訪問MVVM父視圖模型

上圖說明了我的程序。箭頭指示Binding

我MainWindow.xaml有其DataContext的設置爲MainVM

該窗口的選項卡控件綁定到的ObservableCollectionViewModel s。使用數據模板,選項卡控件顯示與ViewModel對應的視圖。

ObservableCollectionMainVM被發現。

如何從ViewModel(包含在ObservableCollection中)訪問在MainVM中找到的屬性?

我打開那些需要我的編程模型的修正答案。

回答

6

建立在肯特說的基礎上。 。 。

從體系結構的角度來看,您的視圖模型類不應該需要知道什麼MainVM。它需要知道的任何東西都應該傳遞給ViewModel的實例,以便它可以保持原子性,而不必擔心那些調用它的東西。從固體觀點來看,這是依賴倒置原理。

無論需要進行內訪問視圖模型從MainVM性質應視圖模型的實例的部分建築進行傳遞。就我個人而言,我很喜歡將它們包含在構造函數中,但也可以將它們作爲屬性公開。

矯枉過正的方法(我不推薦),正在建立的構造方法來MainVM的實例,並傳入this在構造函數中。例如: -

public class ViewModel 
{ 
    private readonly MainVM _parent; 

    public MainVM Parent => _parent; 

    public ViewModel(MainVM parent) 
    { 
      _parent = parent; 
    } 
} 

那麼當您創建視圖模型你可以:

ViewModel vm = new ViewModel(this); 
+1

我改變了我的程序與依賴倒置原則工作。現在,而不是包含該屬性的MainVM,我的ViewModel包含該屬性並通過MainVM保持同步。 – 2011-01-12 07:28:21

2

誰創造的ViewModel實例?如果MainVMViewModel之間存在緊密關係,那麼ViewModel或許應該在其構造函數中採用MainVM的實例。

另一種方法是提出不同的設計,不需要ViewModel即可訪問MainVM。這樣做需要更多信息(還有一個單獨的問題)。

4

根據您需要多少交互,您可以通過從類別ViewModel中觸發事件並使用MainVM處理它們並相應地在各個ViewModel上設置屬性來進行相反的操作。當你實例化視圖模型收藏(我假設在MainVM地方?做)

另一種選擇是,你可以只在MainVM通過爲構造函數的參數,並保持和MainVM實例中的每個ViewModel內。