首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >除非由conductor激活,否则Caliburn.Micro IChild.Parent为空

除非由conductor激活,否则Caliburn.Micro IChild.Parent为空
EN

Stack Overflow用户
提问于 2013-05-30 17:41:42
回答 2查看 1.4K关注 0票数 0

我有一个父子视图模型:

代码语言:javascript
复制
public class ParentViewModel : Screen 
{
    public ChildViewModel Child { get; set; }
}

public class ChildViewModel  : PropertyChangedBase, IChild { }

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

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

这是设计出来的吗?

在此之前,非常感谢您。

EN

回答 2

Stack Overflow用户

发布于 2013-05-30 18:41:31

是的,这是设计好的,设置Parent属性的方法是ConductorBase中的EnsureItem,因此当活动项发生变化时,只有conductors才会设置它。

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

有没有什么原因让你的ParentViewModel不是Conductor类型,而你的ChildViewModel是一个屏幕?

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

票数 4
EN

Stack Overflow用户

发布于 2013-05-30 18:03:08

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

通过显式设置Parent属性:

代码语言:javascript
复制
var child = new ChildViewModel
{
    Parent = this
};

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

代码语言:javascript
复制
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的视图模型处理代码来自动设置父对象,但我还不够聪明,不知道如何做到这一点。:)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16832780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档