我希望主视图模型有一个特定的列表,然后从许多其他视图模型访问。
例如,在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访问列表,那么您的选项是:
-
将List作为构造函数参数或公共属性传递给OtherVM。然后OtherVM就可以把它当作一个成员。
-
将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);