我希望用Caliburn.Micro显示的屏幕/视图模型的正确解析方法是什么
以前,我一直在使用一个IWidgetConductor,它维护一个IWidget对象(基本上就是我的视图模型)的集合,然后我查询以获得我希望激活的屏幕/视图模型。
namespace App
{
using System;
using System.Collections.Generic;
using System.Linq;
using App.ViewModels;
public enum WidgetType
{
WidgetA,
WidgetB,
WidgetC,
}
public interface IWidgetMetaData
{
WidgetType WidgetType { get; }
}
public class WidgetConductor
{
private readonly IEnumerable<Lazy<IWidget, IWidgetMetaData>> widgets;
private readonly DialogViewModel dialogViewModel;
public WidgetConductor(IEnumerable<Lazy<IWidget, IWidgetMetaData>> widgets, DialogViewModel dialogViewModel)
{
this.widgets = widgets;
this.dialogViewModel = dialogViewModel;
}
public IWidget GetWidget(WidgetType widgetType)
{
var lazy = this.widgets.FirstOrDefault(e => e.Metadata.WidgetType == widgetType);
return lazy == null ? null : lazy.Value;
}
public object GetWidgetAsDialog(WidgetType widgetType)
{
return this.dialogViewModel.ShowDialog(this.GetWidget(widgetType));
}
}
}我用我的IoC容器(Autofac)注册我的Widget:
builder.RegisterType<WidgetConductor>()
.AsSelf()
.SingleInstance();
builder.RegisterMetadataRegistrationSources();
builder.Register(e => new StatusBarViewModel(e.Resolve<EventAggregator>()))
.As<IWidget>()
.WithMetadata<IWidgetMetaData>(e => e.For(m => m.WidgetType, WidgetType.StatusBarViewModel));WidgetConductor通过其构造函数传递给Shell视图模型。
可以使用EventAggregator在我的应用程序中的某个位置发布display screen事件,在将其传递给ActivateItem之前,我会从事件处理对象中查询WidgetConductor以获得所需的Widget
var widget = this.widgetConductor.GetWidget(WidgetType.StatusBarViewModel);
ActivateItem(widget);不过,我觉得我好像是在绕过Caliburn.Micro提供的Conductor。有没有一种方法可以使用Conductor实现相同的结果
发布于 2014-11-05 02:13:05
ShellViewModel继承Conductor<Lazy<IWidget, IWidgetMetaData>>.Collection.OneActive或AllActive。OneActive一次允许一个视图模型,AllActive允许所有视图模型都处于活动状态(例如MDI)。
您现在可以访问一个名为Items的属性,在本例中是BindableCollection>() (在幕后是一个ObserableCollection(),但带有AddRange(object x)。通过您的"ShellViewModel“构造函数上的常规枚举,您可以导入IWidget(s),就像您已经对自定义conductor所做的那样。。
然后,您可以填充菜单或项目控件...
使用<ItemsControl x:Name="Items" />可以显示集合中已经存在的小部件(当然是样式化的),然后使用<ContentControl x:Name="ActiveItem" />和一些基于有问题的项目call ActivateItem(SomeWidget)的激活码,在某种程度上单击...
http://caliburnmicro.com/documentation/
注意:参考示例使用MEF作为IoC容器,并且是Silverlight实现的,关闭策略对于WPF略有不同。AutoFac应该没问题。
hth,
摩根
https://stackoverflow.com/questions/26732668
复制相似问题