我有一个父子视图模型:
public class ParentViewModel : Screen
{
public ChildViewModel Child { get; set; }
}
public class ChildViewModel : PropertyChangedBase, IChild { }当使用Conductor.ActivateItem()显示父VM时,Caliburn.Micro会执行通常的工作,如搜索视图模型对象图和查找要显示的视图等。
完成所有这些之后,我发现ParentViewModel.Parent是对Conductor的引用,而ChildViewModel.Parent是null。
这是设计出来的吗?
在此之前,非常感谢您。
发布于 2013-05-30 18:41:31
是的,这是设计好的,设置Parent属性的方法是ConductorBase中的EnsureItem,因此当活动项发生变化时,只有conductors才会设置它。
因此,Parent也仅在孩子的激活生命周期中可用,例如OnInitialise或OnActivate等。
有没有什么原因让你的ParentViewModel不是Conductor类型,而你的ChildViewModel是一个屏幕?
此外,根据Parent属性,可能会在您的ChildViewModel中引入耦合。
发布于 2013-05-30 18:03:08
解决此问题的一种方法是父VM以某种方式将自身传递给子VM。
通过显式设置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的视图模型处理代码来自动设置父对象,但我还不够聪明,不知道如何做到这一点。:)
https://stackoverflow.com/questions/16832780
复制相似问题