我想知道“区域(regions)”的意义是什么,我猜我不理解它们所解决的问题。
例如,我看到很多人将区域用于导航区域,但为什么不只是使用绑定到ObservableCollection的ItemsControl,而不是有一个区域并加载不同的导航元素到该区域中?
一个现实生活中对其使用/优势的例子会非常好!
我想知道“区域(regions)”的意义是什么,我猜我不理解它们所解决的问题。
例如,我看到很多人将区域用于导航区域,但为什么不只是使用绑定到ObservableCollection的ItemsControl,而不是有一个区域并加载不同的导航元素到该区域中?
一个现实生活中对其使用/优势的例子会非常好!
区域可以让您在程序中定义一个特定用途的位置。例如,您可能会有一个菜单区域或页脚区域。然后,您可以将这些特定区域的Views/ViewModels分离到程序的自己部分。
因此,您不再需要在ApplicationViewModel
中包含MenuViewModel
和FooterViewModel
属性,并使View绑定每个部分到这些属性。相反,您将为菜单和页脚拥有独立的ViewModels,而您的ApplicationViewModel仅需要处理内容。这是一种更好的方式来分隔应用程序中的某些逻辑边界。
个人认为,区域被过度使用和滥用了。除非我有像页眉或页脚这样与我的应用程序代码无关的内容,否则我几乎从不使用它们。它们也大多在视图优先的开发中使用,我更喜欢 ViewModel 优先。
[Export("Calendar")]
public class CalendarView : UserControl, ICalendarView { }
那么,视图之间能够相互了解吗?是的!例如,我的EmailUserControl
有一个搜索栏/邮件列表和一个预览窗格。这两个控件可以是EmailListUserControl
,它由一个搜索栏和一个ItemsControl组成,以及一个EmailContentUserControl
,它只是所选电子邮件的预览窗格。它们必须是单独的控件吗?不一定,但如果是,我们可以在单独的窗口中打开电子邮件时重用EmailContentUserControl
。因此,这是一个例子,其中EmailUserControl
与两个不同的视图(EmailListUserControl
和EmailContentUserControl
)耦合。
为什么这比其他方法更好/不同:它使视图之间解耦(并防止视图模型需要知道视图的情况发生)。
ContentPlaceHolder
控件上。楼主说“相对于其他选择”,而这是我在一个应用程序中成功使用过的一种替代方法。但是我没有事件聚合器,这使得这个解决方案更具吸引力。有了它,我认为你可以将视图选择逻辑从父视图中解耦出来。我认为这意味着父视图不需要了解选择逻辑,视图模型也不需要,而且选择逻辑也不需要知道哪个父视图. - Merlyn Morgan-GrahamRegion 可以使用的场景
我浏览了这篇文章来获取答案: http://www.developmentalmadness.com/archive/2009/10/14/mvvm-and-prism-101-ndash-part-3-regions.aspx
据我所知,Region 功能的设计目的在于允许 View 在既不是您的视图也不是您的视图模型的代码中进行注册/注入。
举个例子,如果您使用 ContentPresenter
控件而不是 Region,则您的视图模型必须返回具体视图,以使主视图保持对其子视图的不可知性。
如果您使用 ItemsControl
并将其绑定到视图模型上的任意数据,则需要在主视图上的 DataTemplate 中指定要实例化的视图。
我正在寻找引人入胜的现实用例 :) 在几乎所有情况下,您可以简单地使用 UserControl
,并且可以放弃整个动态注册过程,而没有真正的不利影响。
Main
函数(或等效的WPF应用程序启动方法)之外调用Resolve
。一些DI库没有围绕这种用法设计其容器,因此对于这些容器的作者来说,与我意见不合似乎是很自然的事情。不确定Prism是否是这样的。 - Merlyn Morgan-Graham
#region
。我本来要写一个答案说:“完全没有意义——编译器会忽略它们,而无能的程序员会用它们代替重构”。 - Merlyn Morgan-Graham