我应该在子视图模型中存储对父视图模型的引用吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我应该在子视图模型中存储对父视图模型的引用吗?相关的知识,希望对你有一定的参考价值。

那么,如果我在子ViewModel中存储父ViewModel的引用会是犯罪吗?我会打破MVVM规则吗?我的子视图是一个带有上下文菜单的窗口。选择适当的菜单项时,需要创建新的子视图。父级仅负责创建子视图。所以保持对父视图模型的引用,对我来说会有很大帮助。同时我不想打破模式规则。

class MainViewModel
{
    List<ChildViewModel> _childrenViewModels = new List<ChildViewModel>();

    public AddChild(ChildViewModel childViewModel)
    {
        _childrenViewModels.Add(childViewModel);
        childViewModel.Owner = this;
    }
}

class ChildViewModel
{
    private Child _child;
    public MainViewModel Owner { get; set; }

    public ChildViewModel(Child child)
    {
        _child = child;
    }
}
答案

没有。一般来说,如果你多次使用这种技术试图将它隐藏在抽象背后,事实上这就是着名的Caliburn.Micro [我喜欢它]项目用它的IChild interface

另一答案

答案是否定的,但为了您的目的,如果父母所做的一切都是创建子视图模型,为什么还需要这个引用。拥有这种联系的目的是什么?

另一答案

虽然这种模式根本不是犯罪或“代码味道”,但在许多情况下,它可能更好地以接口的实现者的形式传递对父级的引用,而不是作为它自己的类。因此,只有子进程中需要访问的属性或方法才能在接口中定义,但子进程不能访问父类的其他公共方法或属性,如果误用,可能会导致错误。这可能涉及更多的代码,但类之间更松散的连接可能会带来好处。如果不出意外,它有助于使孩子和父母之间的联系更加自我记录,并使阅读代码的人更容易理解。

以上是关于我应该在子视图模型中存储对父视图模型的引用吗?的主要内容,如果未能解决你的问题,请参考以下文章

我应该在 Silverlight 项目中使用模型-视图-视图模型 (MVVM) 模式吗?

OnInitialize 和 OnActivate 不会在子视图模型上调用

视图模型应该对视图控制器中的事件做出反应吗?

如何使用视图模型从存储库中获取数据

我应该避免在 Laravel 项目中使用数据库视图吗?

在控制器中引用模型类,因此多个数据可以在一个视图中