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

14

我希望主ViewModel拥有一个特定的列表,并可以从许多其他ViewModel中访问。

例如,我将在MainViewModel.cs中拥有一个包含50个数字的列表,然后在NumListViewModel.cs中,我想要访问它以便将其显示为列表,在AddNumViewModel.cs中,我想要能够更新该列表。

有人建议我使用事件/事件聚合器,我也这样做了,但是不幸的是,据我所知,我只能用它将一个数字从一个视图发送到另一个视图并告诉它更新列表,但问题是,随着程序的增长,我需要在主视图模型中有很多订阅者,当实际发生某些事情时,我将不得不根据订阅者的数量“发布”事件,这使得维护更加困难。

我还找到了另一个答案,指示在mainVM内创建另一个VM的实例,并将参数设置为“this”,这是对mainVM的引用。它有效,但同样会变得相当冗长。

所以我的问题是,有没有一种更好的方法可以从另一个VM访问属性?
就像字面上拥有包含列表的类的实例一样在主VM中,然后只需能够从其他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:我知道这个问题已经被问过了,而且我也做过研究,但是我发现找到的答案都太“静态”了,我想说?


2
使用 Prism 解析您的 MainViewModel 实例。 - Nikhil Agrawal
1个回答

25

如果您想从外部 ViewModel 直接访问列表,则有以下两种选项:

  1. 将该列表作为构造函数参数或公共属性传递给 OtherVM。然后,OtherVM 可以像处理成员一样处理它。

  2. 将 MainVM 作为构造函数参数或公共属性传递给 OtherVM。然后,OtherVM 可以通过先访问 MainVM 来访问该列表。

示例:

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"或"Instance",这样你就可以从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);

2
非常感谢!选项#3解决了问题!选项1和2都可以正常工作,但随着项目的增长,我将不得不多次传递实例/列表,因此我认为这对于大规模应用程序来说不是一个好的做法。 - Asaf
@BTownTKD 我知道这个问题有点老了,但我有一个问题。我已经尝试了你的代码,但是以相反的顺序。即我已经在OtherVM上声明了Instance属性,并且我想在mainVM中访问它。我没有收到任何错误,但是当我在MainVM中访问OtherVM的任何属性时,我没有得到该属性的值。我的意思是,我得到的是null而不是该属性的值。 - Khushi
你需要将其作为一个新问题发布。 - BTownTKD
@BTownTKD,你能在#2中举个例子吗?我该如何将列表/对象作为构造函数参数传递? - Brian Var
@BTownTKD 我在以下情况下遇到了第三个选项的问题:在 MainVM 的构造函数中,我正在调用 OtherVM 构造函数。在 OtherVm 构造函数中,我使用了 Instance 属性。在这种情况下,Instance 为空。 - Keerthivel
@Keerthivel 这听起来应该是一个新问题,关于解决两个相互依赖/耦合对象之间初始化顺序的问题。 - BTownTKD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接