从另一个视图模型访问属性

时间:2013-01-16 11:13:27

标签: wpf mvvm properties viewmodel

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

  • 主窗口
    • LoginView
    • ProjectsView

LoginViewProjectsView是由MainWindow导入的用户控件。两个视图都分配了视图模型。 LoginViewModel定义了一个属性ProjectList,它通过调用webservice来设置。现在LoginViewModel需要访问ProjectList属性和其他属性。

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

应该怎么做?我应该像Prism一样使用某种EventAggregator吗?或者还有其他方法可以做到这一点吗?

2 个答案:

答案 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 = ....
    }
}

如你所见,它非常简单,LoginVMProjectsVM会保留对创建它们的MainViewModel的引用,从而授予他们访问ProjectList的权限

答案 1 :(得分:2)

  

应该怎么做?我应该使用某种EventAggregator   喜欢在棱镜?或者还有其他方法可以做到这一点吗?

以下是一些想法:

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

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