Wpf MEF问题-出口工厂<;T>;在Caliburn.Micro中

Wpf MEF问题-出口工厂<;T>;在Caliburn.Micro中,wpf,mef,caliburn.micro,Wpf,Mef,Caliburn.micro,我在Caliburn.Micro中使用MEF导出视图模型类。我希望使用ExportFactory类而不是Export属性,因为我尝试解决与此处所述相同的问题: 我尝试解决这个问题,例如: 某些视图模型-WPF窗口: [Export(typeof(IChatViewModel))] [PartCreationPolicy(CreationPolicy.NonShared)] public class ChatViewModel : Screen, IViewModelIdentity,

我在Caliburn.Micro中使用MEF导出视图模型类。我希望使用ExportFactory类而不是Export属性,因为我尝试解决与此处所述相同的问题:

我尝试解决这个问题,例如:

某些视图模型-WPF窗口:

[Export(typeof(IChatViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ChatViewModel : Screen, IViewModelIdentity, 
    IChatViewModel, IHandle<Rp>, IHandle<DetailData>
{}
   [Export(typeof(IShellViewModel))]
    public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShellViewModel
    {
        protected override void OnInitialize()
        {
            ShowLogOn();
            base.OnInitialize();
        }

        public void ShowLogOn()
        {
            var vm = IoC.Get<ILogOnViewModel>();
            //var vm = _viewModelControler.CreateLogOnViewModel();
            ActivateItem(vm);
        }

        public void ShowMessenger(Account account)
        {
            ActiveItem.Deactivate(true);
            var vm = IoC.Get<IMessengerViewModel>();
            //var vm = _viewModelControler.CreateMessengerViewModel();
            vm.Account = account;
            ActivateItem(vm);
        }

    }
我的外壳看起来像这样:

  //SHELL is WPF window  
    [Export(typeof(IShellViewModel))]
    public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShellViewModel
    {
        [Import]
        public IViewModelsControler ViewModelControler{ get; set;}

        protected override void OnInitialize()
        {
            ShowLogOn();
            base.OnInitialize();
        }

        public void ShowLogOn()
        {
            //var vm = IoC.Get<ILogOnViewModel>();
            var vm = ViewModelControler.CreateLogOnViewModel();
            ActivateItem(vm);
        }

        public void ShowMessenger(Account account)
        {
            ActiveItem.Deactivate(true);
            //var vm = IoC.Get<IMessengerViewModel>();
            var vm = ViewModelControler.CreateMessengerViewModel();
            vm.Account = account;
            ActivateItem(vm);
        }

    }
[Export(typeof(ILogOnViewModel))]
public class LogOnViewModel : Screen,ILogOnViewModel
{}
和shell:

[Export(typeof(IChatViewModel))]
[PartCreationPolicy(CreationPolicy.NonShared)]
public class ChatViewModel : Screen, IViewModelIdentity, 
    IChatViewModel, IHandle<Rp>, IHandle<DetailData>
{}
   [Export(typeof(IShellViewModel))]
    public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShellViewModel
    {
        protected override void OnInitialize()
        {
            ShowLogOn();
            base.OnInitialize();
        }

        public void ShowLogOn()
        {
            var vm = IoC.Get<ILogOnViewModel>();
            //var vm = _viewModelControler.CreateLogOnViewModel();
            ActivateItem(vm);
        }

        public void ShowMessenger(Account account)
        {
            ActiveItem.Deactivate(true);
            var vm = IoC.Get<IMessengerViewModel>();
            //var vm = _viewModelControler.CreateMessengerViewModel();
            vm.Account = account;
            ActivateItem(vm);
        }

    }
[导出(类型化(IShellViewModel))]
公共类ShellViewModel:Conductor.Collection.OneActive,IShellViewModel
{
受保护的重写void OnInitialize()
{
ShowLogOn();
base.OnInitialize();
}
public void ShowLogOn()
{
var vm=IoC.Get();
//var vm=_viewModelControler.CreateLogOnViewModel();
激活肽(vm);
}
公共void ShowMessenger(帐户)
{
ActiveItem.Deactivate(true);
var vm=IoC.Get();
//var vm=_viewModelControler.CreateMessengerViewModel();
vm.Account=Account;
激活肽(vm);
}
}
问题出在哪里?在MEF boostraper课程中?我使用clasic MEF boostrape:


感谢您的建议、时间和帮助。

您仍然需要导出要导出的类。使用ExportFactory可以创建多个实例,但如果要创建实例的对象没有“导出”属性,则无法使用该属性。

您好,Plaisted先生,谢谢您的解释。我有一个问题,它可能在chatWindow对象上调用Dispose方法。对象是使用ExportFactory创建的:var chatScreen=ViewModelControler.CreatChatViewModel();
   [Export(typeof(IShellViewModel))]
    public class ShellViewModel : Conductor<IScreen>.Collection.OneActive, IShellViewModel
    {
        protected override void OnInitialize()
        {
            ShowLogOn();
            base.OnInitialize();
        }

        public void ShowLogOn()
        {
            var vm = IoC.Get<ILogOnViewModel>();
            //var vm = _viewModelControler.CreateLogOnViewModel();
            ActivateItem(vm);
        }

        public void ShowMessenger(Account account)
        {
            ActiveItem.Deactivate(true);
            var vm = IoC.Get<IMessengerViewModel>();
            //var vm = _viewModelControler.CreateMessengerViewModel();
            vm.Account = account;
            ActivateItem(vm);
        }

    }