【发布时间】:2013-10-31 19:41:12
【问题描述】:
我使用 MEF 和 Prism 在 WPF 中编写了一个具有三个不同区域的 MVVM 应用程序。代码跨两个模块,在 App.Config 中被发现。
我的所有导航命令和结构都运行良好,但我感到困惑的一件事是如何设置在应用启动时加载到每个区域的初始视图,因为我似乎无处可做。此外,如果我在 MainViewModel 构造函数的末尾添加一些内容以显式导航到屏幕集 A,其他东西似乎会覆盖它并加载不同的视图集。
这似乎还取决于我在 app.config 上加载模块的顺序,这似乎是不可取的。如果我最后加载管理模块,它会从管理模块加载一组屏幕,如果我最后加载搜索模块,它会从搜索模块加载一组视图,在这种情况下,它甚至找不到视图主要地区。
使用MEF和配置发现时,在应用启动时指定哪些Views加载到每个区域的方法是什么?
using System;
using System.ComponentModel.Composition;
using Microsoft.Practices.Prism.Regions;
namespace CRM.GUI.WPF.Shared.Infrastructure.Behaviour
{
[Export(typeof(AutoPopulateExportedViewsBehavior))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class AutoPopulateExportedViewsBehavior : RegionBehavior, IPartImportsSatisfiedNotification
{
protected override void OnAttach()
{
AddRegisteredViews();
}
public void OnImportsSatisfied()
{
AddRegisteredViews();
}
private void AddRegisteredViews()
{
if (Region != null)
{
foreach (var viewEntry in RegisteredViews)
{
if (viewEntry.Metadata.RegionName == Region.Name)
{
var view = viewEntry.Value;
if (!Region.Views.Contains(view))
{
Region.Add(view);
}
}
}
}
}
[ImportMany(AllowRecomposition = true)]
public Lazy<object, IViewRegionRegistration>[] RegisteredViews { get; set; }
}
}
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
[MetadataAttribute]
public class ViewExportAttribute : ExportAttribute, IViewRegionRegistration
{
public ViewExportAttribute()
: base(typeof(object))
{ }
public ViewExportAttribute(string viewName)
: base(viewName, typeof(object))
{ }
public string RegionName { get; set; }
}
二手
[ViewExport(RegionName = RegionNames.MainRegion)]
public partial class ReportView
【问题讨论】:
-
嗨!真的很难说。您是否有导入视图的区域行为?可以发一下吗?
-
已更新以包含代码
-
看起来不错,如果在 OnAttach() 方法中设置断点:是否命中,
RegisteredViews包含什么?你也可以发布外壳吗?