MEF 生命周期PartCreationPolicy

为什么要单独把这个生命周期捞出来单独说一说呢?因为我今天就被这个东东坑了一把……新加了一个界面,第二次打开界面的时候会报错“指定的元素已经是另一个元素的逻辑子元素”。好嘛,我一看,哟,感觉就是xaml有问题啊。当然这个代码是基于MEF框架MVVM模式的。

    [Export("ViewA", typeof(IView))]
    public partial class ViewA : UserControl,IView
    {
        public ViewA()
        {
            InitializeComponent();
        }
    }
    [Export("ViewB", typeof(IView))]
    [PartCreationPolicy(CreationPolicy.NonShared)]
    public partial class ViewB : UserControl,IView
    {
        public ViewB()
        {
            InitializeComponent();
        }
    }

为了确认是View层的问题,我就换了一下Import的View层(A变为B),结果多次打开界面也没有问题,说明什么?A.xaml果断是有问题的。是把xaml中的所有控件都清除,只保留最底层的Grid,再打开还是报一样的错。跟踪也看不出来,ViewModel没有问题,View的xaml也没有问题,那就只能是View的CodeBehind有问题了,一比对,果然发现少写了PartCreationPolicy。

上面的内容可能说的不是很清楚,但是只要知道,如果再系统中需要关闭某个界面,再重新打开时需要新创建一个实例的就不能忘记设置PartCreationPolicy.

原文地址:https://www.cnblogs.com/YunGy/p/5050867.html