从另一个ViewModel访问属性

Asa*_*saf 7 c# wpf mvvm viewmodel

我希望主视图模型具有某个列表,然后从许多其他视图模型访问.

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

有人建议我使用event/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...
}
Run Code Online (Sandbox Code Playgroud)

OtherVM.cs:

public class OtherVM
{
    lst.Add(3);
}
Run Code Online (Sandbox Code Playgroud)

PS:是的,我知道它已经被问到了,是的,我已经完成了我的研究,但是我发现的答案太"静止",我猜?

BTo*_*TKD 16

如果您想从外部ViewModel 直接访问列表,那么您的选项是:

  1. 将List作为构造函数参数或公共属性传递给OtherVM.然后,OtherVM可以像对待成员一样对待它.

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

  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);
Run Code Online (Sandbox Code Playgroud)

  • 非常感谢!选项#3 完成了工作!选项 1 和选项 2 工作正常,但随着项目的增长,我将不得不多次传递实例/列表,所以我想这对于大型应用程序来说不是一个好的做法。 (2认同)