Caliburn Micro:此应用程序的最佳方法

时间:2012-08-14 08:41:42

标签: wpf caliburn.micro

我是WPF和Caliburn Micro的新手,需要一些关于如何整理我的应用的建议。

该应用程序是数据挖掘框架的配置编辑器。在应用程序中,将有一个主窗口,左侧列中有网格和树视图,右列中有不同的设置编辑器。右侧显示的特定编辑器取决于树视图中选择的项目。每个编辑器由几个控件组成(在一种情况下最多约200个)。

在编辑器之间切换时,我认为应该隐藏/停用前一个编辑器而不是关闭以提高切换速度。

我现在想知道的是组织这个应用程序的最佳方式是什么以及我如何在编辑器之间切换?

1 个答案:

答案 0 :(得分:1)

假设您正在使用ViewModel第一种方法,请检查ISceens和Screen实现吗?当前的Caliburn.Micro下载包含一个带有屏幕协调器实现的演示项目(SimpleMDI)

您可以使用主视图模型中的“激活/取消激活”功能来处理“属性”视图之间的切换。

主视图模型应该来自校准提供的Conductor<T>.Collection.OneActive实现,其中T应该是IScreen。这使您的主视图模型一次只能激活一个屏幕。

基本上,如果将“选定项目”绑定到主视图模型中的属性,则可以查看属性更改通知(使用NotifyOfPropertyChange),然后使用某种例程来决定切换到哪个视图。

Caliburn将保持缓存视图(在Conductor上使用GetChildren),以便在它们之间切换 - 保持性能。

我使用这样的东西来动态地实例化我的控件基于数据库和可用的libs(注意我的例子有点令人困惑,因为CurrentView实际上是一个自定义类型而不是真正的视图 - 它只是一个数据库对象,描述已经选择的控件..我应该改变它!)

public MainPageViewModel : Caliburn.Micro.Conductor<IScreen>.Collection.OneActive
{
    #region Property Changed handler

    public override void NotifyOfPropertyChange(string propertyName)
    {
        base.NotifyOfPropertyChange(propertyName);

        // A property changed, update the views if it's the CurrentView property
        UpdateViews(propertyName);
    }

    #endregion

    private void UpdateViews(string propertyName)
    {
        // If the selected item in my list changes, it's bound to CurrentView and contains
        // the fully qualified typename of the ViewModel that the items 'screen' should use
        if (propertyName == "CurrentView")
        {
            // If the selected item changes we need to load the control or retrieve it from the
            // control cache, making sure to update the cache and the active view dictionary
            try
            {                    
                var controlType = Type.GetType(CurrentView.QualifiedTypeName, true);

                // Check to see if the view is already loaded
                var view = GetChildren().FirstOrDefault(x => x.GetType() == controlType);

                // If it is, just activate it
                if (view != null)
                {
                    ActivateItem(view);
                }
                else
                {
                    // Otherwise it's not loaded, load it and activate it
                    view = (IScreen)Activator.CreateInstance(controlType);
                    ActivateItem(view);

                }
         // etc...
    } 
}