首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从Conductor解析屏幕

如何从Conductor解析屏幕
EN

Stack Overflow用户
提问于 2014-11-04 18:18:02
回答 1查看 403关注 0票数 0

我希望用Caliburn.Micro显示的屏幕/视图模型的正确解析方法是什么

以前,我一直在使用一个IWidgetConductor,它维护一个IWidget对象(基本上就是我的视图模型)的集合,然后我查询以获得我希望激活的屏幕/视图模型。

代码语言:javascript
复制
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

代码语言:javascript
复制
            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

代码语言:javascript
复制
var widget = this.widgetConductor.GetWidget(WidgetType.StatusBarViewModel);
ActivateItem(widget);

不过,我觉得我好像是在绕过Caliburn.Micro提供的Conductor。有没有一种方法可以使用Conductor实现相同的结果

EN

回答 1

Stack Overflow用户

发布于 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)的激活码,在某种程度上单击...

参考:https://github.com/Caliburn-Micro/Caliburn.Micro/blob/master/samples/Caliburn.Micro.HelloScreens/Caliburn.Micro.HelloScreens/

http://caliburnmicro.com/documentation/

注意:参考示例使用MEF作为IoC容器,并且是Silverlight实现的,关闭策略对于WPF略有不同。AutoFac应该没问题。

hth,

摩根

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26732668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档