我有一个名为MainViewModel的ViewModel(当然),它包含多个Contructors,如下所示:
[ImportingConstructor]
public MainViewModel(IWindowManager windowManager)
: this(windowManager, new DataProvider(), new LocalJsonPersistenceManager())
{
}
[PreferredConstructorAttribute]
public MainViewModel(IWindowManager windowManager, IInformationProvider infoProvider,
IPersistenceManager persistenceManager)
{
//generating data, handling clicks etc.
}
在ViewModel内部是一个不断更新的公共项目(每当用户点击某个按钮并对表单执行某些操作时):
public Item ClickedItem
{
get { return clickedItem; }
set
{
clickedItem = value;
NotifyOfPropertyChange(() => ClickedItem);
if (ClickedItem != null)
{
FindNextItem();
}
}
}
现在我有一个UserControl我正在构建一个包含ListView的ListView,我将其设置为一个粘性的标题列表视图(当下一个标题到达blabla时标题会向上移动...)。因为我只能通过GroupStyled ListView来实现这一点,所以我必须在后面的C#代码中为ListView构建数据。
编辑: 我正在尝试使用ViewModelLocator:
public class ViewModelLocator
{
public ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
// Create design time view services and models
//SimpleIoc.Default.Register<IDataService, DesignDataService>();
}
else
{
// Create run time view services and models
//SimpleIoc.Default.Register<IDataService, DataService>();
}
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
public static void Cleanup()
{
// TODO Clear the ViewModels
}
}
我正在调用数据的特定值:
var vm1 = (new ViewModelLocator()).Main;
testtxt.Text = vm1.ClickedItem.Name;
但是它一直在运行时给我一条错误信息:
return ServiceLocator.Current.GetInstance<MainViewModel>();
在ViewModelLocator的块中:
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
错误消息 {&#34;在缓存中找不到类型:Caliburn.Micro.IWindowManager。&#34;} ,以及 null 的InnerException消息。
答案 0 :(得分:1)
看起来MEF无法构造IWindowManager
,这是ViewModel的依赖关系。
尝试至少注册来自Caliburn的默认实例。
更新
直接从caliburn.Micro的MEF-Bootstrapper:
container = CompositionHost.Initialize(
new AggregateCatalog(
AssemblySource.Instance.Select(x => new AssemblyCatalog(x)).OfType<ComposablePartCatalog>()
)
);
var batch = new CompositionBatch();
batch.AddExportedValue<IWindowManager>(new WindowManager());
batch.AddExportedValue<IEventAggregator>(new EventAggregator());
batch.AddExportedValue(container);
container.Compose(batch);
答案 1 :(得分:1)
您可以查看Caliburn.Micro Github Samples的示例代码。
您需要在MEF中注册WindowManager。