这份原稿.微IChild.父级为空,除非被导体激活



我有一个父和子视图模型:

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

当显示"父虚拟机"为"Conductor.ActivateItem()"时,Caliburn。Micro完成了搜索视图模型对象图和寻找要显示的视图等日常工作。

在完成所有这些之后,我发现ParentViewModel.Parent是对导体的引用,而ChildViewModel.Parentnull

这是故意的吗?

提前感谢。

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

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

是否有任何原因你的ParentViewModel不是Conductor类型和你的ChildViewModel屏幕?

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

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

显式设置Parent属性:

var child = new ChildViewModel
{
    Parent = this
};

或者,假设您有某种基于ioc的抽象来初始化视图模型对象,您可以有实现返回thisConfigure()方法的约定:

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的视图模型处理代码来自动设置父节点,但我还不够聪明,还不知道怎么做。:)

相关内容

  • 没有找到相关文章

最新更新