我的WPF应用程序遵循MVVM模式。有三种观点:
LoginView
和ProjectsView
是由MainWindow
导入的用户控件。两个视图都分配了视图模型。 LoginViewModel
定义了一个属性ProjectList
,它通过调用webservice来设置。现在LoginViewModel
需要访问ProjectList
属性和其他属性。
我知道一个解决方案可能是重新设计,因此只有一个视图和一个视图模型。我会这样做作为备份解决方案,但我不赞成这样做。
应该怎么做?我应该像Prism一样使用某种EventAggregator吗?或者还有其他方法可以做到这一点吗?
答案 0 :(得分:3)
因此,如果我清楚地理解,ProjectList
属性应该从“LoginViewModel”'和' ProjectsViewModel'。我尝试在' MainViewModel'中实现它。所以子视图模型可以自然地访问它。
IEventAggregator就像一个盒子,你可以在其中添加事件,或者查找和订阅一个事件,所以我会说它不是你需要的。
无论如何,您可以在UnitySingleton.Container
中注册您的自定义界面(框类型),这将公开ProjectList
,以便在任何地方都可以访问它。当模块(单独的程序集)需要相互通信时,这种方法很有意义。
如果这是过度杀戮或不是你的情况,你应该决定,我亲自去把它放在主视图模型中'选项。
- 样本 - (未经测试)
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
的权限
答案 1 :(得分:2)
应该怎么做?我应该使用某种EventAggregator 喜欢在棱镜?或者还有其他方法可以做到这一点吗?
以下是一些想法:
另外,我认为EventAggregator
最适合模块/程序集之间的通信。在您的示例中,似乎所有内容都在同一个程序集中。