silverlight - 在 Silverlight Prism 应用程序中支持多个 "display modes"菜单

标签 silverlight mvvm prism

假设一个标准的 Desktop Explorer 风格的应用程序:

  • 顶部的菜单
  • 左边的导航树
  • 右侧的项目 View

一切都整齐地分为菜单、导航和项目模块。

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

  • “图标 View ”
  • “ ListView ”
  • “详细 View ”

为了捕捉显示类型的变化,我目前发布并订阅了一个 DisplayModeChanged 事件。

第一个问题:

此菜单选项应仅在具有显示模式的适当 View 可见时显示。 控制共享菜单按钮的最佳方式是什么,以便它们仅在至少一个相关 View 处于事件状态时显示?

第二个问题:

如果在进行选择后出现 View ,它应该如何从菜单中获取当前显示模式状态?

最佳答案

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

但此解决方案与您的第二个要求相矛盾,因为您显然希望拥有一些全局“ItemViewDisplayModeSetting”,并且无论何时更改,您都希望通知所有项目 View 并一起更改它们的显示模式。

那么,让我们通过应用依赖注入(inject)原则来正确解决它。不要找东西,要东西。您的菜单呈现器( View 模型)需要一些服务来知道是否有事件的项目 View 。您的 item view presenter 需要一项服务,该服务将提供初始显示模式并通知其更改。我们最终得到这段代码:

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

然后您需要一些方法来从菜单编辑您的显示模式...您可以将它们组合到 IDisplayModeService 中,或者您可以为此创建一个新界面。该实现将是一个简单的类,它包含一个 DisplayMode 实例,您将该类的一个实例注入(inject)到所有菜单和项目 View 中。您还需要实现 IActiveViewsService,这个可能会包装来自 PRISM 的 IRegionManager 或您的 UI 管理机制......它将监听区域变化并在创建新项目 View 时使用react或当没有人离开时。

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.

关于silverlight - 在 Silverlight Prism 应用程序中支持多个 "display modes"菜单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3595563/

相关文章:

c# - 使用 Unity BootStrapper 和 Prsim 将参数传递给 Shell Viewmodel

silverlight - WCF:OneWay OperationContract 上的异常处理

c# - Datagrid 按需卸载

javascript - 单元测试数组推送

wpf - DevExpress WPF 网格使用 MVVM 绑定(bind)到 List<String>

mvvm - Prism.StoreApps中不存在Prism MVVM ValidatableBindableBase

c# - 如何在不破坏 MVVM 的情况下导入我的 ViewModel?

asp.net-mvc - asp.net mvc 网站中的单个silverlight 控件?

wpf - MVVM和Prism v2有什么区别

silverlight-4.0 - MVVM Light Toolkit设计方法(导航和 View 加载)