Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Caliburn.Micro-IChild.Parent为空,除非由导体激活_C#_.net_Caliburn.micro - Fatal编程技术网

C# Caliburn.Micro-IChild.Parent为空,除非由导体激活

C# Caliburn.Micro-IChild.Parent为空,除非由导体激活,c#,.net,caliburn.micro,C#,.net,Caliburn.micro,我有一个父视图模型和子视图模型: public class ParentViewModel : Screen { public ChildViewModel Child { get; set; } } public class ChildViewModel : PropertyChangedBase, IChild { } 当使用Conductor.ActivateItem()显示父VM时,Caliburn.Micro通常会搜索视图模型对象图并查找要显示的视图等 完成所有这些之后

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

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

public class ChildViewModel  : PropertyChangedBase, IChild { }
当使用Conductor.ActivateItem()显示父VM时,Caliburn.Micro通常会搜索视图模型对象图并查找要显示的视图等

完成所有这些之后,我发现虽然
ParentViewModel.Parent
是对导体的引用,
ChildViewModel.Parent
null

这是故意的吗


非常感谢。

解决方法之一是父VM以某种方式将自身传递给子VM

通过显式设置
Parent
属性:

var child = new ChildViewModel
{
    Parent = this
};
或者,假设您有某种基于IoC的抽象来初始化视图模型对象,您可以有一个惯例来实现
Configure()
方法,这些方法返回
this

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);
    }
}
公共类ChildViewModel:PropertyChangedBase,IChild { //IChild成员。。。 公共子视图模型配置(IScreen父级) { 父母=父母; 归还这个; } } 公共类ParentViewModel:屏幕 { 公共ChildViewModel子{get;set;} 受保护的重写void OnInitialize() { Child=\u viewModelFactory.Create() .配置(此); } }
应该可以定制Caliburm.Micro的视图模型处理代码来自动设置父对象,但我还不知道如何做到这一点

解决方法之一是父VM以某种方式将自身传递给子VM

通过显式设置
Parent
属性:

var child = new ChildViewModel
{
    Parent = this
};
或者,假设您有某种基于IoC的抽象来初始化视图模型对象,您可以有一个惯例来实现
Configure()
方法,这些方法返回
this

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);
    }
}
公共类ChildViewModel:PropertyChangedBase,IChild { //IChild成员。。。 公共子视图模型配置(IScreen父级) { 父母=父母; 归还这个; } } 公共类ParentViewModel:屏幕 { 公共ChildViewModel子{get;set;} 受保护的重写void OnInitialize() { Child=\u viewModelFactory.Create() .配置(此); } }
应该可以定制Caliburm.Micro的视图模型处理代码来自动设置父对象,但我还不知道如何做到这一点

是的这是出于设计,设置
父属性的方法是
导体数据库中的
EnsureItem
,因此只有导体在激活项更改时才会设置

因此,
父项
也仅在子项的激活生命周期中可用,例如,
初始化
激活

您的
ParentViewModel
不是
Conductor
类型,您的
ChildViewModel
是屏幕,有什么原因吗


此外,根据
Parent
属性可能会在
ChildViewModel

中引入耦合的情况,这是经过设计的,设置
Parent
属性的方法是
ConductorBase
中的
EnsureItem
,因此只有导体会在激活项发生更改时进行设置

因此,
父项
也仅在子项的激活生命周期中可用,例如,
初始化
激活

您的
ParentViewModel
不是
Conductor
类型,您的
ChildViewModel
是屏幕,有什么原因吗


另外,根据
父属性
的不同,您的
儿童视图模型可能会引入耦合

谢谢您的回复。它不是导体,因为它不传导各种子屏幕。子级实际上只是一个复杂的数据类型,因此我可以拥有一个组合的UI。我现在可以自己设置家长。我需要设置它,因为我有一个
ShowDialog
IResult,它会遍历父对象,直到找到我称之为
IDialogConductorHost
的内容,并要求它的
DialogConductor
显示该对话框。这就是我如何确保所有对话框都显示在同一“层”上的方法。如果
Parent
属性为null,则链将断开,并且
ShowDialog
无法到达对话框导体。我明白了。假设您必须使用静态工厂方法并传入子对象的实例?父级不能将工厂类型注入创建IResult类型的子级吗?然后,工厂类型可以采用需要在该上下文中使用的特定对话导体主机。感谢您的回复。它不是导体,因为它不传导各种子屏幕。子级实际上只是一个复杂的数据类型,因此我可以拥有一个组合的UI。我现在可以自己设置家长。我需要设置它,因为我有一个
ShowDialog
IResult,它会遍历父对象,直到找到我称之为
IDialogConductorHost
的内容,并要求它的
DialogConductor
显示该对话框。这就是我如何确保所有对话框都显示在同一“层”上的方法。如果
Parent
属性为null,则链将断开,并且
ShowDialog
无法到达对话框导体。我明白了。假设您必须使用静态工厂方法并传入子对象的实例?父级不能将工厂类型注入创建IResult类型的子级吗?然后,工厂类型可以采用需要在该上下文中使用的特定对话框导体主机。