Импорт MEF не работает с оболочкой, имеющей более одного активного экрана - PullRequest
0 голосов
/ 16 октября 2011

Привет, я пользователь WPF / Calibur Micro / MEF.Я пытаюсь иметь более активный экран в оболочке.Сначала я определяю экраны - пользовательские элементы управления.

  1. Экран - просмотр модели
public interface IProjectsViewModel
{

}
[Export(typeof(IProjectsViewModel))]
public class ProjectsViewModel:Screen,
    IProjectsViewModel
{

}

2. Экран - просмотр модели

public interface IProjectInfoViewModel
{

}

[Export(typeof(IProjectInfoViewModel))]
public class ProjectInfoViewModel :Screen, 
    IProjectInfoViewModel
{
    [Import]
    internal IMessageBox MsgBox { get; set; }

    public void BtnClick()
    {
        MsgBox.ShowInfo("Btn click",string.Empty);
    }
}

На втором экране у меня есть только одна кнопка, если пользователь нажимает на кнопку, отображаемую в окне сообщения.

Нет самой важной части оболочки.Оболочка - это окно WPF.

Вид:

<Window x:Class="CaliburnSkelet.Views.ShellView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:Views="clr-namespace:CaliburnSkelet.Views" 
        xmlns:cal="clr-namespace:Caliburn.Micro;assembly=Caliburn.Micro" 
        Title="ShellView" Height="300" Width="300">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="200"/>
            <ColumnDefinition Width="*"/>
        </Grid.ColumnDefinitions>
        <!--<ContentControl x:Name="Projects" Grid.Column="0"/>
        <ContentControl x:Name="ProjectInfo" Grid.Column="1"/>-->
        <Views:ProjectsView  cal:View.Model="{Binding Projects}" 
                             Grid.Column="0"/>
        <Views:ProjectInfoView cal:View.Model="{Binding ProjectInfo}"
                               Grid.Column="1"/>
    </Grid>
</Window>

ShellViewModel:

public interface IShellViewModel :IScreen
{
    ProjectInfoViewModel ProjectInfo { get; set; }
    ProjectsViewModel Project { get; set; }
}

[Export(typeof(IShellViewModel))]
public class ShellViewModel:Conductor<IScreen>.Collection.AllActive,
    IShellViewModel, IPartImportsSatisfiedNotification

{
    [Import]
    public ProjectInfoViewModel ProjectInfo { get; set; }

    [Import]
    public ProjectsViewModel Project { get; set; }

    public void OnImportsSatisfied()
    {
    }
}

Если я пытаюсь скомпилировать этот код, я получаю ошибку:

Не удалось найти экземпляры контракта CaliburnSkelet.ViewModels.IShellViewModel.

StackTrace:

  at CaliburnSkelet.BootStraper.MefBootStrapper.GetInstance(Type serviceType, String key) in E:\C# PROJECTS\CaliburnSkelet\CaliburnSkelet\BootStraper\MefBootStrapper.cs:line 69
   at Caliburn.Micro.Bootstrapper.DisplayRootViewFor(Type viewModelType)
   at Caliburn.Micro.Bootstrapper`1.OnStartup(Object sender, StartupEventArgs e)
   at System.Windows.Application.OnStartup(StartupEventArgs e)
   at System.Windows.Application.<.ctor>b__1(Object unused)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

Я пытался выполнить тест и изменить свойства оболочкикласс модели представления.

[Export(typeof(IShellViewModel))]
public class ShellViewModel:Conductor<IScreen>.Collection.AllActive,
    IShellViewModel, IPartImportsSatisfiedNotification

{
    //[Import]
    public ProjectInfoViewModel ProjectInfo { get; set; }

    //[Import]
    public ProjectsViewModel Project { get; set; }

    public void OnImportsSatisfied()
    {
        ProjectInfo=new ProjectInfoViewModel();
        Project=new ProjectsViewModel();
    }
}

Я не импортирую классы моделей представления в оболочку модели представления с MEF, но создаю новые экземпляры в методе OnImportsSatisfied.

Приложение запускается, но если я нажимаю кнопкупеременная MsgBox равна нулю.

Код из класса ProjectInfoViewModel:

        [Import]
        internal IMessageBox MsgBox { get; set; }

        public void BtnClick()
        {
//MsgBox is null
            MsgBox.ShowInfo("Btn click",string.Empty);
        }

Где может быть проблема?

здесь?Conductor.Collection.AllActive

1 Ответ

2 голосов
/ 16 октября 2011

Для вашего типа ShellViewModel свойства ProjectInfo и Project должны иметь тип IProjectInfoViewModel и IProjectsViewModel, так как это типы, которые вы экспортировали, и вы должны работать с этими интерфейсами.

...