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

时间:2010-08-29 16:29:48

标签: silverlight mvvm prism

假设标准的桌面浏览器样式应用程序:

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

并且所有内容都整齐地分为菜单,导航和项目模块。

菜单有一个通用的“视图” - > “显示模式”菜单选择,用于更改当前项目视图:

  • “图标视图”
  • “列表视图”
  • “详情视图”

要捕获显示类型更改,我目前发布并订阅DisplayModeChanged事件。

第一个问题:

此菜单选项仅在具有显示模式的可见视图可见时显示。 控制共享菜单按钮的最佳方法是什么,以便只显示至少一个相关视图是否处于活动状态?

第二个问题:

如果在选择之后视图出现,如何从菜单中拾取当前显示模式状态?

1 个答案:

答案 0 :(得分:2)

我的第一个想法是,您可以通过将项目视图菜单设置与项目视图一起存储来解决第一个问题。然后,在视图激活时,您会询问您想要显示的“自定义菜单操作”的新视图,其中一个将是项目视图的“显示模式”。其他视图将提供其他菜单操作,并且不会显示此操作。

但是这个解决方案与你的第二个要求相矛盾,因为你显然想要一些全局的“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,这个可能会从PRISM或任何你的UI管理机制中包装IRegionManager ...它将监听区域更改并在创建新项目视图时或在有新项目视图时做出反应没有人离开。

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;
    }
}

HTH。