wpf - 使用 MEF 和 ExportAttribute 加载视图时出现问题
问题描述
我有一个 WPF 应用程序,我正在尝试使用 MEF 加载视图模型和视图。我无法成功加载视图。编码:
public interface IContent
{
void OnNavigatedFrom( );
void OnNavigatedTo( );
}
public interface IContentMetadata
{
string ViewUri { get; }
}
[MetadataAttribute]
public class ExtensionMetadataAttribute : ExportAttribute
{
public string ViewUri { get; private set; }
public ExtensionMetadataAttribute(string uri) : base(typeof(IContentMetadata))
{
this.ViewUri = uri;
}
}
class ViewContentLoader
{
[ImportMany]
public IEnumerable<ExportFactory<IContent, IContentMetadata>> ViewExports
{
get;
set;
}
public object GetView(string uri)
{
// Get the factory for the View.
var viewMapping = ViewExports.FirstOrDefault(o =>
o.Metadata.ViewUri == uri);
if (viewMapping == null)
throw new InvalidOperationException(
String.Format("Unable to navigate to: {0}. " +
"Could not locate the View.",
uri));
var viewFactory = viewMapping.CreateExport();
var view = viewFactory.Value;
return viewFactory;
}
}
我应该像这样使用这段代码:
1)装饰一个用户控件
[Export(typeof(IContent))]
[ExtensionMetadata("CustomPause")]
[PartCreationPolicy(System.ComponentModel.Composition.CreationPolicy.NonShared)]
public partial class CustomPause : Page , IContent, IPartImportsSatisfiedNotification
{
public CustomPause()
{
InitializeComponent();
}
}
2)组成部分:
var cv = new CompositionContainer(aggregateCatalog);
var mef = new ViewContentLoader();
cv.ComposeParts(mef);
3) 在给定 URI 的情况下在运行时加载视图,例如:
private void CustomPause_Click(object sender, RoutedEventArgs e)
{
var vc = GlobalContainer.Instance.GetMefContainer() as ViewContentLoader;
MainWindow.MainFrame.Content = vc.GetView ("CustomPause");
}
问题是 GetView 方法中的这一行失败:
var viewMapping = ViewExports.FirstOrDefault(o =>
o.Metadata.ViewUri == uri);
查询失败,因此 viewMapping 为空,但组合似乎没问题,我可以看到 ViewExports 包含一个类型的对象:
{System.ComponentModel.Composition.ExportFactory<EyesGuard.MEF.IContent, EyesGuard.MEF.IContentMetadata>[0]
我不知道我错在哪里。你有线索吗?
詹保罗
解决方案
我忘记了这个
[AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]
在元数据属性中
推荐阅读
- python - 将数组分解为组件数组
- selenium-webdriver - 机器人未检测到 Web 元素
- android - 如何获取图像视图的触摸点
- meteor - 在我的应用程序中运行流星会引发错误:ENOENT:没有这样的文件或目录
- javascript - 有没有办法使用函数的参数来使用点符号定位对象中的项目?
- javascript - Javascript var在计算中不起作用
- sql-server - 根据插入的 scope_identity() 在 SQL Server 中设置列的值
- algorithm - 计算最佳情况、平均情况和最坏情况的算法复杂度
- html - HTML 附件仅对使用 Outlook 应用程序(非默认邮件应用程序)的 iPhone 用户变为纯文本
- android - Kotlin:无法重新分配 LatLng 的纬度/经度