除非由指挥激活,否则Caliburn.Micro IChild.Parent为空

时间:2013-05-30 09:41:42

标签: c# .net caliburn.micro

我有一个父子视图模型:

public class ParentViewModel : Screen 
{
    public ChildViewModel Child { get; set; }
}

public class ChildViewModel  : PropertyChangedBase, IChild { }

当使用Conductor.ActivateItem()显示父虚拟机时,Caliburn.Micro会执行搜索视图模型对象图并查找要显示的视图等的常规工作。

完成所有这些操作后,我发现虽然ParentViewModel.Parent是对指挥的引用,但ChildViewModel.Parentnull

这是设计吗?

非常感谢提前。

2 个答案:

答案 0 :(得分:4)

是的,这是设计使用,Parent属性的EnsureItem属性设置为ConductorBase,因此它只是在活动项目更改时设置它的导体。

Parent因此仅在儿童的激活生命周期中可用,例如OnInitialiseOnActivate等。

您的ParentViewModel不是Conductor类型和ChildViewModel屏幕是否有任何理由?

此外,根据Parent属性,您可能会在ChildViewModel中引入耦合。

答案 1 :(得分:0)

一种解决方法是让父虚拟机以某种方式将自身传递给子虚拟机。

通过明确设置Parent属性:

var child = new ChildViewModel
{
    Parent = this
};

或者,假设您有一些基于IoC的抽象来初始化视图模型对象,您可以实现返回Configure()的{​​{1}}方法的约定:

this

应该可以自定义Caliburm.Micro的视图模型处理代码来自动设置父级,但是我还不够聪明,还不知道如何做到这一点。 :)