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类型的子级吗?然后,工厂类型可以采用需要在该上下文中使用的特定对话框导体主机。