在Composite WPF (Prism)中,IRegion.Add和IRegionManager.RegisterViewWithRegion有什么区别?

14

Composite WPF (Prism)中,向IRegionManger集合添加模块时,使用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 ) );
}
2个回答

15
区别在于谁负责创建视图。 在场景中(也称为视图注入),您需要事先实例化视图。 在使用RegisterViewWithRegion(也称为视图发现)的另一种情况下,区域管理器本身实例化视图。
有一些技术原因会让您选择使用其中之一。 例如:
  • 如果您有更复杂的创建视图的方式(也许您想通过手动设置DataContext属性来创建View和其ViewModel并将它们联系在一起),则需要使用视图注入。
  • 如果您利用了区域范围,您将被迫使用视图注入。
相关文档是: 对于视图合成(包括视图注入与视图发现以及关于视图优先或视图Presenter优先方法的讨论): http://msdn.microsoft.com/zh-cn/library/dd458944.aspx 还有一个很方便的“何时使用每个”部分。 这是来自文档的摘录:
  • 显式或编程控制何时创建和显示视图,或者当您需要从区域中删除视图时(例如,作为应用程序逻辑的结果)。
  • 将多个相同的视图实例显示到区域中,其中每个视图实例都绑定到不同的数据。
  • 控制将视图添加到区域的哪个实例(例如,如果您想将客户详细信息视图添加到特定的客户详细信息区域)。 请注意,此场景需要稍后在本主题中描述的作用域区域。
希望这有所帮助。

@Anderson - 你的回答确实有帮助。我的理解是,IRegion.Add和IRegionManager.RegisterViewWithRegion都会创建视图的具体实例,并立即将其添加到IRegionCollection中。诚然,我对CAG只是有了一个初步的了解。你能给我指出一个更详细的示例吗?我已经浏览了快速入门和操作指南,但我并没有完全掌握何时使用其中之一,因为示例在Imodule.Initialize方法中使用它们时似乎没有任何不同。 - Metro Smurf
不,区别在于使用Add时,您传递的是已经实例化的视图。而使用RegisterViewWithRegion时,您可以传递Type、Delegate或Object(实例化视图)。大多数情况下,后者的重载不会被使用。稍等一下,我会指引您在文档中找到正确的位置。 - Anderson Imes
更新了文档中最佳资源的链接,并提取了官方措辞,以便区分何时使用视图注入和视图发现。希望这样更加清晰易懂。 - Anderson Imes
@Anderson - 我会花些时间在下午重新阅读UI Composition文档。顺便说一句:我认为两种方法都立即创建了一个具体的视图实例并添加到IRegionCollection中,这是通过调试器进行调试并在RegisterViewWithRegion周期的末尾创建并添加的。非常感谢您的帮助! - Metro Smurf
1
当然,这种情况总是会发生的。这只是代码负责实例化的问题...是你的代码还是他们的代码 :) - Anderson Imes

1

RegisterViewWithRegion会触发OnContentRegistered事件,但这取决于您的DI实现方式。


当您使用方括号运算符直接修改属性时,不会触发事件,但是当您调用其他方法时,您将获得修改后的集合和一个可以通知任何监听它的事件。 - slf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接