首页 > 解决方案 > 使用 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]

我不知道我错在哪里。你有线索吗?

詹保罗

标签: wpfmef

解决方案


我忘记了这个

 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false)]

在元数据属性中


推荐阅读