我有一个父子视图模型:
public class ParentViewModel : Screen
{
public ChildViewModel Child { get; set; }
}
public class ChildViewModel : PropertyChangedBase, IChild { }
当使用Conductor.ActivateItem()
显示父虚拟机时,Caliburn.Micro会执行搜索视图模型对象图并查找要显示的视图等的常规工作。
完成所有这些操作后,我发现虽然ParentViewModel.Parent
是对指挥的引用,但ChildViewModel.Parent
为null
。
这是设计吗?
非常感谢提前。
答案 0 :(得分:4)
是的,这是设计使用,Parent
属性的EnsureItem
属性设置为ConductorBase
,因此它只是在活动项目更改时设置它的导体。
Parent
因此仅在儿童的激活生命周期中可用,例如OnInitialise
或OnActivate
等。
您的ParentViewModel
不是Conductor
类型和ChildViewModel
屏幕是否有任何理由?
此外,根据Parent
属性,您可能会在ChildViewModel
中引入耦合。
答案 1 :(得分:0)
一种解决方法是让父虚拟机以某种方式将自身传递给子虚拟机。
通过明确设置Parent
属性:
var child = new ChildViewModel
{
Parent = this
};
或者,假设您有一些基于IoC的抽象来初始化视图模型对象,您可以实现返回Configure()
的{{1}}方法的约定:
this
应该可以自定义Caliburm.Micro的视图模型处理代码来自动设置父级,但是我还不够聪明,还不知道如何做到这一点。 :)