代码之家  ›  专栏  ›  技术社区  ›  iCollect.it Ltd

在Silverlight Prism应用程序中支持多种“显示模式”菜单

  •  3
  • iCollect.it Ltd  · 技术社区  · 14 年前

    假设使用标准桌面资源管理器样式的应用程序:

    • 顶部菜单
    • 左侧导航树
    • 右侧项目视图

    所有东西都被整齐地分为菜单、导航和项目模块。

    该菜单有一个通用的“视图”->“显示模式”菜单选择,可在以下两种模式之间更改当前项目视图:

    • “列表视图”
    • “详细视图”

    为了捕捉显示类型的更改,我当前发布并订阅了一个DisplayModeChanged事件。

    第一个问题:

    控制共享菜单按钮的最佳方法是什么,以便它们仅在至少一个相关视图处于活动状态时显示?

    第二个问题:

    如果在选择之后出现了一个视图, 它应该如何从菜单中选取当前的显示模式状态?

    1 回复  |  直到 14 年前
        1
  •  2
  •   Massimiliano    14 年前

    我的第一个想法是你可以解决第一个问题 将“项目视图”菜单设置与“项目视图”一起存储在某个位置

    但是这个解决方案与您的第二个需求相矛盾,因为您显然希望有一些全局的“ItemViewDisplayModeSetting”,并且每当它被更改时,您都希望所有的项视图都得到通知并一起更改它们的显示模式。

    所以,让我们马上解决它 应用依赖注入原理 . 不要找东西,要东西。您的菜单演示者(视图模型)需要一些知道是否存在活动项视图的服务。项目视图演示者需要提供初始显示模式并通知其更改的服务。我们最终得到了以下代码:

    interface IActiveViewsService : INotifyPropertyChanged
    {
        bool HasActiveViewsSupportingDisplayMode { get; }
    }
    
    interface IDisplayModeService : INotifyPropertyChanged
    {
        DisplayMode DisplayMode { get; }
    }
    
    //your item view presenter (view model)
    class ItemViewModel
    {
        public ItemViewModel(IDisplayModeService displayModeService)
        {
            //obtain initial setting
            //subscribe to property changes
        }
    }
    
    //your menu presenter (view model)
    class MenuViewModel
    {
        public MenuViewModel(IActiveViewsService activeViewsService)
        {
            //obtain initial setting
            //subscribe to property changes
        }
    }
    

    然后你需要一些方法来编辑你的Diplay模式从菜单。。。您可以将其组合到IDisplayModeService中,也可以为此创建一个新接口。实现将是一个简单的类,其中包含一个DisplayMode实例,您可以将该类的一个实例注入到所有菜单和项目视图中。你还需要实施 IActiveViewsService

    interface IDisplayModeEditor
    {
        void ChangeDisplayMode(DisplayMode newMode);
    }
    
    //your final menu presenter (view model)
    class MenuViewModel
    {
        public MenuViewModel(IActiveViewsService activeViewsService, IDisplayModeEditor modeEditor)
        {
            //obtain initial setting
            //subscribe to property changes
        }
    }
    
    //your final menu presenter (view model)
    class DisplayModeStorage : IDisplayModeService, IDisplayModeEditor
    {
        private DisplayMode displayMode;
    
        public DisplayMode DisplayMode 
        { 
            get { return this.displayMode; } 
    
            //standard propertychange notification
            set
            {
                 if(value == this.displayMode)
                    return;
    
                 this.displayMode = value;
                 this.RaisePropertyChanged("DisplayMode");
            }
        }
    
        public void ChangeDisplayMode(DisplayMode newMode)
        {
             this.DisplayMode = newMode;
        }
    }
    

    嗯。