0

我有一个父子视图模型:

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

public class ChildViewModel  : PropertyChangedBase, IChild { }

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

这一切都完成后,我发现 whileParentViewModel.Parent是对 Conductor 的引用,ChildViewModel.Parentnull.

这是设计使然吗?

提前谢谢了。

4

2 回答 2

4

是的,这是设计使然,设置Parent属性的方法EnsureItem在 中ConductorBase,因此只有导体会在活动项目更改时设置它。

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

有什么理由你ParentViewModel不是Conductor类型和你ChildViewModel的屏幕?

此外,根据Parent属性可能会在您的ChildViewModel.

于 2013-05-30T10:41:30.820 回答
0

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

通过显式设置Parent属性:

var child = new ChildViewModel
{
    Parent = this
};

或者,假设你有某种基于 IoC 的抽象来初始化视图模型对象,你可以有一个实现Configure()返回的方法的约定this

public class ChildViewModel : PropertyChangedBase, IChild
{
    // IChild members...

    public ChildViewModel Configure(IScreen parent)
    {
        Parent = parent;
        return this;
    }
}

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

    protected override void OnInitialize()
    {
        Child = _viewModelFactory.Create<ChildViewModel>()
                                 .Configure(this);
    }
}

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

于 2013-05-30T10:03:08.177 回答