从一个ViewModel中访问另一个ViewModel中的属性

本文关键字:ViewModel 访问 属性 另一个 一个 | 更新日期: 2023-09-27 18:13:15

我希望主视图模型有一个特定的列表,然后从许多其他视图模型访问。

例如,在MainViewModel.cs中,我将有一个50个数字的列表,然后在NumListViewModel.cs,我想访问它,以显示它作为一个列表,并在AddNumViewModel.cs我希望能够更新该列表。

这是建议我使用事件/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...
}

OtherVM.cs:

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

PS:是的,我知道已经有人问过这个问题了,是的,我做了我的研究,但是我发现的答案太"静态"了,我猜?

从一个ViewModel中访问另一个ViewModel中的属性

如果您希望直接从外部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);            
    }
}
  • 给MainVM一个静态属性叫做"Default"或"实例;所以你可以从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);