簡體   English   中英

從另一個 ViewModel 訪問一個屬性

[英]Accessing a property in one ViewModel from another

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

例如,在 MainViewModel.cs 中我將有一個 50 個數字的列表,然后在 NumListViewModel.cs 中,我想訪問它以便將其顯示為列表,並且在 AddNumViewModel.cs 中我希望能夠更新該列表。

有人建議我使用 events / evenaggerator,我這樣做了,但不幸的是,據我所知,我所能做的就是將一個 num 從一個視圖發送到另一個視圖並告訴它更新列表,但問題是,程序增長,我需要在主視圖模型中有很多訂閱者,當實際發生某些事情時,我將不得不根據訂閱者的數量“發布”事件,這使得維護變得更加困難。

我還找到了另一個答案,指示在 mainVM 中創建另一個 VM 的實例,參數設置為“this”,這是對 mainVM 的引用。 它有效,但話又說回來,它可能會變得很長。

所以我的問題是,有沒有更好的方法從另一個 VM 訪問屬性?
就像字面上有一個在 mainVM 中保存列表的類的實例,然后只需能夠從其他 VM 更新/訪問它,而無需顯式編程哪個 VM 可以。 會讓生活變得如此輕松。

在您的回答中,請盡量避免建議框架。 雖然有一些非常好的,但我希望至少能夠自己做到這一點。

例如:

MainVM.cs:

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

其他VM.cs:

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

PS:是的,我知道它已經被問過了,是的,我已經進行了研究,但是我發現的答案太“靜態”了,我猜?

如果您想從外部 ViewModel直接訪問列表,那么您的選擇是:

  1. 將 List 作為構造函數參數或公共屬性傳遞給 OtherVM。 然后,OtherVM 可以將其視為成員。

  2. 將 MainVM 作為構造函數參數或公共屬性傳遞給 OtherVM。 然后OtherVM可以通過首先訪問MainVM來訪問List。

例子:

public class MainVM
{
    public List<XX> MyList { get; set; }
}

public class OtherVM
{
    public MainVM TheMainVM { get; set; }

    public OtherVM(MainVM theMainVM)
    {
        TheMainVM = theMainVM;
        
        // Access the MainVM's list 
        TheMainVM.MyList.Add(stuff);            
    }
}
  1. 為 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM