我的WPF应用程序遵循MVVM模式。 有三种观点:
LoginView
和ProjectsView
是由导入的用户控件MainWindow
。 这两种观点都有其指定的视图模型。 LoginViewModel
定义属性ProjectList
这是通过调用webservice的设置。 现在LoginViewModel
需要访问ProjectList
财产等。
我知道,这样只有一个视图和一个视图模型一个解决方案可能是重新设计。 我会做,作为一个备份解决方案,但我赞成不这样做。
应该如何进行? 我应该在棱镜使用某种EventAggregator的怎么样? 还是有其他的方法可以做到这一点?
所以,如果我清楚地理解, ProjectList
属性应该从两个“LoginViewModel”和“ProjectsViewModel”访问。 我想尝试实现它的“MainViewModel”这样子的ViewModels可以以自然的方式访问它。
一个IEventAggregator就像一个盒子,你可以添加事件或发现并定制一个,所以我会说这是不是你所需要的。 无论如何,你可以注册在您的自定义界面(箱式) UnitySingleton.Container
,这将暴露ProjectList
它可访问无处不在。 这种方法使得有很大的意义时模块,它们是分开的组件,需要均可进行相互通信。 如果这是你的情况矫枉过正与否是你应该决定,我会亲自去与“把它放在mainviewmodel”选项。
-样品- (未测试)
public class MainViewModel : ViewModelBase
{
public MainViewModel()
{
LoginVM = new LoginViewModel(this);
ProjectsVM = new ProjectsViewModel(this);
RetrieveProjectList();
}
public LoginViewModel LoginVM { get; private set; }
public ProjectsViewModel ProjectsVM { get; private set; }
public object ProjectList { get; private set; }
private void RetrieveProjectList()
{
ProjectList = ....
}
}
这是很简单的,你看, LoginVM
和ProjectsVM
将举行的一个参考MainViewModel
创建它们,因此使他们能够享受ProjectList
。
应该如何进行? 我应该在棱镜使用某种EventAggregator的怎么样? 还是有其他的方法可以做到这一点?
这里有一些想法:
- 您可以创建两个视图模型继承一个视图模型类。 该基类将包含共享属性。
- 创建一个包含共享属性静态类。
- 使用依赖注入,创建一个包含属性的类,它注册为你的货柜里一个单身并注入到您的视图模型的构建函数。
另外,我相信EventAggregator
是最适合的模块/组件之间进行通信。 在您的例子,好像一切都在同一程序。