我希望主视图模型有一个特定的列表,然后从许多其他 View 模型访问。
例如,在 MainViewModel.cs 中我将有一个包含 50 个数字的列表, 然后在 NumListViewModel.cs 中,我想访问它以便将其显示为列表,在 AddNumViewModel.cs 中我希望能够更新该列表。
有人建议我使用 events/evenaggerator,我确实这样做了,但不幸的是,据我所知,我所能做的就是从一个 View 向另一个 View 发送一个数字并告诉它更新列表,但问题是是,随着程序的增长,我将需要在主视图模型中有很多订阅者,当实际发生某些事情时,我将不得不根据订阅者的数量“发布”事件,这使得维护更加困难。
我还找到了另一个答案,指示在 mainVM 中创建 anotherVM 的实例,并将参数设置为“this”,这是对 mainVM 的引用。 它有效,但话又说回来,它可能会变得很长。
所以我的问题是,是否有更好的方式从另一个 VM 访问属性?
就像在 mainVM 中拥有一个包含列表的类的实例,然后就可以从其他 VM 更新/访问它,而不必明确编程哪个 VM 可以。会让生活变得更轻松。
在您的回答中,请尽量避免建议框架。 虽然有一些非常好的,但我希望至少自己能够做到这一点。
例如:
主虚拟机.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 中直接访问列表,那么您的选择是:
将列表作为构造函数参数或公共(public)属性传递给 OtherVM。然后 OtherVM 可以将其视为成员。
将 MainVM 作为构造函数参数或公共(public)属性传递给 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 提供一个称为“默认”或“实例”的静态属性,这样您就可以从 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);
关于c# - 从一个 ViewModel 访问另一个 ViewModel 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16506653/