2013-05-12 121 views
5

我希望主視圖模型有一個特定的列表,然後從許多其他視圖模型訪問。從另一個ViewModel訪問另一個屬性

例如,在MainViewModel.cs我將有50個號碼的列表,然後 在NumListViewModel.cs,我想訪問,以顯示它作爲一個列表,並在AddNumViewModel.cs我d喜歡能夠更新該列表。

有人建議我使用events/evenaggerator,但是不幸的是,對於我所知道的所有我可以做的事情是將數字從一個視圖發送到另一個視圖並告訴它更新列表,但是問題在於,隨着程序的增長,我需要在主視圖模型中擁有大量訂閱者,並且當發生某些事情時,我將不得不根據訂閱者數量「發佈」事件,這使得維護更加困難。

我還發現了另一個答案,指示在mainVM中創建另一個VM的實例,參數設置爲「this」,它是對主VM的引用。它可以工作,但是再次,它可能會變得很長。

所以我的問題是,有沒有更好的方式來訪問另一個虛擬機的屬性?
就像在字面上有一個在mainVM中保存列表的類的實例,然後就能夠從其他VM更新/訪問它,而不必明確地編程哪個VM。會讓生活變得如此簡單。

在您的答案中,請儘量避免提示框架。 雖然有一些非常好的,但我希望能夠自己做到這一點。

例如:

MainVM.cs:

public class MainVM 
{ 
    List lst = new List(); //Let's just say it's full... 
} 

OtherVM.cs:

public class OtherVM 
{ 
    lst.Add(3); 
} 

PS:是的,我知道它已經被問則已,是的,我已經做了我的研究,但我發現的答案太'靜態',我猜?

+1

使用棱鏡來解決您的MainViewModel的實例。 – 2013-05-12 11:02:00

回答

11

如果你想從外部視圖模型直接訪問列表,那麼你的選擇是:

  1. 傳遞的列表中OtherVM構造函數參數或公共財產。然後,OtherVM可以像一個成員一樣對待它。

  2. 將MainVM作爲構造函數參數或公共屬性傳遞給OtherVM。然後,OtherVM可以通過首先訪問MainVM來訪問列表。

  3. 爲MainVM指定一個名爲「Default」或「Ins​​tance」的靜態屬性,以便您可以從OtherVM中訪問MainVM的靜態實例,而不必將其指定爲成員字段。

例子:

public class MainVM 
{ 
    private static MainVM _instance = new MainVM(); 
    public static MainVM Instance { get { return _instance; } } 

    public List<XX> MyList { get; set; } 
    //other stuff here 
} 

//From within OtherVM: 
MainVM.Instance.MyList.Add(stuff); 
+1

非常感謝!選項#3完成了這項工作!選項1和2工作正常,但隨着項目的增長,我將不得不通過實例/列表不止一次,所以我認爲這不適用於大規模應用程序。 – Asaf 2013-05-12 13:17:33

+0

@BTownTKD我知道這個問題有點老,但我有一個問題。我已經嘗試了你的代碼,但是以相反的順序。即我已經在OtherVM上聲明瞭Instance屬性,並且我想在mainVM中訪問它。我沒有得到任何錯誤,但是當我在MainVM中訪問OtherVM的任何屬性時,我沒有獲得該屬性的值。我的意思是我得到空值而不是該屬性的值。 – Khushi 2013-12-10 13:57:23

+0

您需要將其作爲新問題發佈。 – BTownTKD 2013-12-10 14:09:56