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