我有一个父和子视图模型:
public class ParentViewModel : Screen
{
public ChildViewModel Child { get; set; }
}
public class ChildViewModel : PropertyChangedBase, IChild { }
当显示"父虚拟机"为"Conductor.ActivateItem()
"时,Caliburn。Micro完成了搜索视图模型对象图和寻找要显示的视图等日常工作。
在完成所有这些之后,我发现ParentViewModel.Parent
是对导体的引用,而ChildViewModel.Parent
是null
。
这是故意的吗?
提前感谢。
是的,这是通过设计,设置Parent
属性的方法是ConductorBase
中的EnsureItem
,因此只有导体在活动项更改时才会设置它。
因此Parent
也只在子进程的激活生命周期中可用,例如OnInitialise
或OnActivate
等。
是否有任何原因你的ParentViewModel
不是Conductor
类型和你的ChildViewModel
屏幕?
此外,根据Parent
属性可能会在ChildViewModel
中引入耦合。
一种解决方法是父虚拟机以某种方式将自己传递给子虚拟机。
显式设置Parent
属性:
var child = new ChildViewModel
{
Parent = this
};
或者,假设您有某种基于ioc的抽象来初始化视图模型对象,您可以有实现返回this
的Configure()
方法的约定:
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的视图模型处理代码来自动设置父节点,但我还不够聪明,还不知道怎么做。:)