2

我的 WPF 应用程序遵循 MVVM 模式。共有三种观点:

  • 主窗口
    • 登录视图
    • 项目查看

LoginView并且ProjectsView是由MainWindow. 两个视图都分配了它们的视图模型。LoginViewModel定义ProjectList通过调用 web 服务设置的属性。现在LoginViewModel需要访问ProjectList财产和其他人。

我知道一种解决方案可能是重新设计,以便只有一个视图和一个视图模型。我会这样做作为备份解决方案,但我不赞成这样做。

这应该怎么做?我应该在 Prism 中使用某种 EventAggregator 吗?还是有其他方法可以做到这一点?

4

2 回答 2

3

因此,如果我清楚地理解,ProjectList应该从“LoginViewModel”和“ProjectsViewModel”访问属性。我会尝试在“MainViewModel”中实现它,以便子视图模型可以自然地访问它。

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.

于 2013-01-16T12:50:14.697 回答
2

这应该怎么做?我应该在 Prism 中使用某种 EventAggregator 吗?还是有其他方法可以做到这一点?

这里有一些想法:

  • 您可以创建两个视图模型都继承自的视图模型类。这个基类将包含共享属性。
  • 创建一个包含共享属性的静态类。
  • 使用依赖注入,创建一个包含属性的类,将其注册为容器中的单例并将其注入到视图模型的 ctors 中。

另外,我相信它EventAggregator最适合模块/程序集之间的通信。在您的示例中,似乎所有内容都在同一个程序集中。

于 2013-01-16T15:40:46.693 回答