从另外一个视图模型的访问属性(Access properties from one view mod

2019-08-07 01:31发布

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

  • 主窗口
    • LoginView
    • ProjectsView

LoginViewProjectsView是由导入的用户控件MainWindow 。 这两种观点都有其指定的视图模型。 LoginViewModel定义属性ProjectList这是通过调用webservice的设置。 现在LoginViewModel需要访问ProjectList财产等。

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

应该如何进行? 我应该在棱镜使用某种EventAggregator的怎么样? 还是有其他的方法可以做到这一点?

Answer 1:

所以,如果我清楚地理解, 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 = ....
    }
}

这是很简单的,你看, LoginVMProjectsVM将举行的一个参考MainViewModel创建它们,因此使他们能够享受ProjectList



Answer 2:

应该如何进行? 我应该在棱镜使用某种EventAggregator的怎么样? 还是有其他的方法可以做到这一点?

这里有一些想法:

  • 您可以创建两个视图模型继承一个视图模型类。 该基类将包含共享属性。
  • 创建一个包含共享属性静态类。
  • 使用依赖注入,创建一个包含属性的类,它注册为你的货柜里一个单身并注入到您的视图模型的构建函数。

另外,我相信EventAggregator是最适合的模块/组件之间进行通信。 在您的例子,好像一切都在同一程序。



文章来源: Access properties from one view model in another