Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.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
在复合WPF(Prism)中,IRegion.Add和IRegionManager.RegisterViewWithRegion之间有什么区别?_Prism_Cag - Fatal编程技术网

在复合WPF(Prism)中,IRegion.Add和IRegionManager.RegisterViewWithRegion之间有什么区别?

在复合WPF(Prism)中,IRegion.Add和IRegionManager.RegisterViewWithRegion之间有什么区别?,prism,cag,Prism,Cag,在中,将模块添加到IRegionManager集合时,使用IRegion.Add和IRegionManager.RegisterViewWithRegion有什么区别 IRegion.Add public void Initialize() { _regionManager.Regions["MainRegion"].Add( new ModuleAView() ); } IRegionManager.RegisterViewWithRegion public void Initial

在中,将模块添加到IRegionManager集合时,使用IRegion.Add和IRegionManager.RegisterViewWithRegion有什么区别

IRegion.Add

public void Initialize()
{
    _regionManager.Regions["MainRegion"].Add( new ModuleAView() );
}
IRegionManager.RegisterViewWithRegion

public void Initialize()
{
    _regionManager.RegisterViewWithRegion( "MainRegion", typeof( ModuleAView ) );
}

RegisterViewWithRegion会引发OnContentRegistered事件,但当然这不可能,这取决于您的DI。区别在于谁负责创建视图。在
IRegion.Add
场景(也称为视图注入)中,您负责预先实例化视图。在另一个使用RegisterViewWithRegion(也称为视图发现)的场景中,区域管理器实例化视图本身

有一些技术上的原因,你会想做一个或另一个。比如说

  • 您有一种更复杂的创建视图的方法(可能您希望创建视图及其ViewModel,并通过自己设置DataContext属性将它们结合起来),您需要使用视图注入
  • 如果您利用区域作用域,您将被迫使用视图注入
有关文件如下: 对于视图合成(包括视图注入与视图发现以及视图优先或视图演示者优先方法的讨论):

还有一个非常方便的“何时使用每个”部分。以下是这些文件的摘录:

  • 显式或编程控制视图的创建时间和 显示,或在需要时显示 例如,从区域中删除视图 例如,作为应用程序的结果 逻辑
  • 要在一个区域中显示相同视图的多个实例,其中 每个视图实例都绑定到 不同的数据
  • 控制添加视图的区域实例的步骤(例如 例如,如果要添加 特定客户的客户详细信息视图 客户详细信息区域)。注意 此场景需要限定范围 本章后面将描述的区域 话题

希望这能有所帮助。

@Anderson-你的回答确实有帮助。我的理解是,IRegion.Add和IRegionManager.RegisterViewWithRegion都创建了视图的具体实例,并立即将其添加到IRegionCollection中。不可否认,我刚刚在CAG站稳脚跟。你能给我举个更详细的例子吗?我已经阅读了QuickStarts和HowTos,但我没有确切地掌握何时使用它们,因为示例正在Imodule.Initialize方法中使用它们,并且在示例中两者似乎都没有做任何不同的事情。不,区别在于Add,您传递的是一个已经实例化的视图。使用RegisterViewWithRegion,可以传入类型、委托或对象(实例化视图)。大多数情况下,后一个重载没有被使用。请稍等,我会在文档中为您指出正确的位置。更新了文档中最佳资源的链接,我拿出了关于何时使用视图注入和视图发现的官方措辞。希望它比我的描述更清楚。@Anderson-今天下午我将花一些时间重新阅读UI合成文档。fwiw:我假设这两种方法都会立即创建一个视图的具体实例到IRegionCollection,这是基于逐步通过调试器,在RegisterViewWithRegion循环结束时,创建了一个视图的具体实例并将其添加到集合中。非常感谢你的帮助!当然,这种情况总是会发生的。这正是代码负责实例化的原因。。。您的或他们的:)当您使用方括号运算符直接修改属性时,不会引发事件,但是当您调用另一个方法时,您会得到修改后的集合和一个可以通知任何侦听者的事件